Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-orderedmultidict for 
openSUSE:Factory checked in at 2026-03-29 20:01:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-orderedmultidict (Old)
 and      /work/SRC/openSUSE:Factory/.python-orderedmultidict.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-orderedmultidict"

Sun Mar 29 20:01:16 2026 rev:6 rq:1343455 version:1.0.2

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-orderedmultidict/python-orderedmultidict.changes
  2025-06-02 22:01:51.856465275 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-orderedmultidict.new.8177/python-orderedmultidict.changes
        2026-03-29 20:01:46.704116863 +0200
@@ -1,0 +2,8 @@
+Sun Mar 15 20:53:43 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 1.0.2:
+  * homogenize indentation
+  * add tests for __version__ metadata
+  * remove readme linebreaks
+
+-------------------------------------------------------------------

Old:
----
  orderedmultidict-1.0.1.tar.gz

New:
----
  orderedmultidict-1.0.2.tar.gz

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

Other differences:
------------------
++++++ python-orderedmultidict.spec ++++++
--- /var/tmp/diff_new_pack.UrXsvK/_old  2026-03-29 20:01:47.340143066 +0200
+++ /var/tmp/diff_new_pack.UrXsvK/_new  2026-03-29 20:01:47.340143066 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-orderedmultidict
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-orderedmultidict
-Version:        1.0.1
+Version:        1.0.2
 Release:        0
 Summary:        Ordered Multivalue Dictionary
 License:        Unlicense
@@ -53,9 +53,6 @@
 %pyproject_install
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
-%check
-%pyunittest discover -v tests/
-
 %files %{python_files}
 %doc README.md
 %license LICENSE.md

++++++ orderedmultidict-1.0.1.tar.gz -> orderedmultidict-1.0.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orderedmultidict-1.0.1/PKG-INFO 
new/orderedmultidict-1.0.2/PKG-INFO
--- old/orderedmultidict-1.0.1/PKG-INFO 2019-07-10 22:11:44.000000000 +0200
+++ new/orderedmultidict-1.0.2/PKG-INFO 2025-11-18 09:00:40.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: orderedmultidict
-Version: 1.0.1
+Version: 1.0.2
 Summary: Ordered Multivalue Dictionary
 Home-page: https://github.com/gruns/orderedmultidict
 Author: Ansgar Grunseid
@@ -21,11 +21,10 @@
 Classifier: Intended Audience :: Developers
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: Implementation :: PyPy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orderedmultidict-1.0.1/README.md 
new/orderedmultidict-1.0.2/README.md
--- old/orderedmultidict-1.0.1/README.md        2018-10-17 00:18:13.000000000 
+0200
+++ new/orderedmultidict-1.0.2/README.md        2025-02-26 03:28:44.000000000 
+0100
@@ -12,14 +12,14 @@
   <a href="https://pypi.python.org/pypi/orderedmultidict";><img 
src="https://img.shields.io/pypi/pyversions/orderedmultidict.svg";></a>
 </p>
 
-### omdict is an ordered multivalue dictionary that retains<br>method parity 
with Python's [dict](http://docs.python.org/library/stdtypes.html#dict) and 
helps power [furl](https://github.com/gruns/furl).
+### omdict is an ordered multivalue dictionary that retains method parity with 
Python's [dict](http://docs.python.org/library/stdtypes.html#dict) and helps 
power [furl](https://github.com/gruns/furl).
 
-A multivalue dictionary is a dictionary that can store multiple values per\
-key. An ordered multivalue dictionary is a multivalue dictionary that\
-retains the order of insertions and deletions.
+A multivalue dictionary is a dictionary that can store multiple values
+per key. An ordered multivalue dictionary is a multivalue dictionary
+that retains the order of insertions and deletions.
 
-orderedmultidict is well tested, [Unlicensed](http://unlicense.org/) in the 
public domain,\
-supports Python 2, Python 3, PyPy2, and PyPy3.
+orderedmultidict is well tested, [Unlicensed](http://unlicense.org/) in
+the public domain, supports Python 2, Python 3, PyPy2, and PyPy3.
 
 Code time: omdict can store multiple values per key.
 
@@ -71,7 +71,7 @@
 
 ### API
 
-See all of omdict's methods, with examples, in omdict's API document,\
+See all of omdict's methods, with examples, in omdict's API document,
 [API.md](https://github.com/gruns/orderedmultidict/blob/master/API.md).
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orderedmultidict-1.0.1/orderedmultidict/__init__.py 
new/orderedmultidict-1.0.2/orderedmultidict/__init__.py
--- old/orderedmultidict-1.0.1/orderedmultidict/__init__.py     2019-01-08 
07:54:23.000000000 +0100
+++ new/orderedmultidict-1.0.2/orderedmultidict/__init__.py     2022-12-23 
07:53:59.000000000 +0100
@@ -10,12 +10,8 @@
 # License: Build Amazing Things (Unlicense)
 #
 
-from os.path import dirname, join as pjoin
-
 from .orderedmultidict import *  # noqa
 
 # Import all variables in __version__.py without explicit imports.
-meta = {}
-with open(pjoin(dirname(__file__), '__version__.py')) as f:
-    exec(f.read(), meta)
-globals().update(dict((k, v) for k, v in meta.items() if k not in globals()))
+from . import __version__
+globals().update(dict((k, v) for k, v in __version__.__dict__.items()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orderedmultidict-1.0.1/orderedmultidict/__version__.py 
new/orderedmultidict-1.0.2/orderedmultidict/__version__.py
--- old/orderedmultidict-1.0.1/orderedmultidict/__version__.py  2019-07-10 
22:02:25.000000000 +0200
+++ new/orderedmultidict-1.0.2/orderedmultidict/__version__.py  2025-11-18 
08:53:51.000000000 +0100
@@ -11,7 +11,7 @@
 #
 
 __title__ = 'orderedmultidict'
-__version__ = '1.0.1'
+__version__ = '1.0.2'
 __license__ = 'Unlicense'
 __author__ = 'Ansgar Grunseid'
 __contact__ = '[email protected]'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orderedmultidict-1.0.1/orderedmultidict/orderedmultidict.py 
new/orderedmultidict-1.0.2/orderedmultidict/orderedmultidict.py
--- old/orderedmultidict-1.0.1/orderedmultidict/orderedmultidict.py     
2019-07-10 22:04:45.000000000 +0200
+++ new/orderedmultidict-1.0.2/orderedmultidict/orderedmultidict.py     
2020-11-07 16:31:42.000000000 +0100
@@ -20,14 +20,20 @@
 
 from .itemlist import itemlist
 
+# There's no typing module until 3.5
+if sys.version_info >= (3, 5):
+    from typing import Iterable, Tuple, Any, List, Dict
+
 if six.PY2:
     from collections import MutableMapping
 else:
     from collections.abc import MutableMapping
 try:
-    from collections import OrderedDict as odict  # Python 2.7 and later.
+    # Python 2.7 and later.
+    from collections import OrderedDict as odict  # type: ignore
 except ImportError:
-    from ordereddict import OrderedDict as odict  # Python 2.6 and earlier.
+    # Python 2.6 and earlier.
+    from ordereddict import OrderedDict as odict  # type: ignore
 
 
 _absent = object()  # Marker that means no parameter was provided.
@@ -223,7 +229,7 @@
         # <leftovers>. Items in <replacements> are new values to replace old
         # values for a given key, and items in <leftovers> are new items to be
         # added.
-        replacements, leftovers = dict(), []
+        replacements, leftovers = dict(), []  # type: Tuple[Dict, List]
         for mapping in chain(args, [kwargs]):
             self._bin_update_items(
                 self._items_iterator(mapping), replace_at_most_one,
@@ -626,7 +632,9 @@
         """
         if key is not _absent:
             if key in self:
-                items = [(node.key, node.value) for node in self._map[key]]
+                items = [
+                    (node.key, node.value) for node in self._map[key]
+                ]  # type: Iterable[Tuple[Any, Any]]
                 return iter(items)
             raise KeyError(key)
         items = six.iteritems(self._map)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orderedmultidict-1.0.1/orderedmultidict.egg-info/PKG-INFO 
new/orderedmultidict-1.0.2/orderedmultidict.egg-info/PKG-INFO
--- old/orderedmultidict-1.0.1/orderedmultidict.egg-info/PKG-INFO       
2019-07-10 22:11:44.000000000 +0200
+++ new/orderedmultidict-1.0.2/orderedmultidict.egg-info/PKG-INFO       
2025-11-18 09:00:40.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: orderedmultidict
-Version: 1.0.1
+Version: 1.0.2
 Summary: Ordered Multivalue Dictionary
 Home-page: https://github.com/gruns/orderedmultidict
 Author: Ansgar Grunseid
@@ -21,11 +21,10 @@
 Classifier: Intended Audience :: Developers
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: Implementation :: PyPy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orderedmultidict-1.0.1/orderedmultidict.egg-info/SOURCES.txt 
new/orderedmultidict-1.0.2/orderedmultidict.egg-info/SOURCES.txt
--- old/orderedmultidict-1.0.1/orderedmultidict.egg-info/SOURCES.txt    
2019-07-10 22:11:44.000000000 +0200
+++ new/orderedmultidict-1.0.2/orderedmultidict.egg-info/SOURCES.txt    
2025-11-18 09:00:40.000000000 +0100
@@ -12,6 +12,4 @@
 orderedmultidict.egg-info/SOURCES.txt
 orderedmultidict.egg-info/dependency_links.txt
 orderedmultidict.egg-info/requires.txt
-orderedmultidict.egg-info/top_level.txt
-tests/test_itemlist.py
-tests/test_orderedmultidict.py
\ No newline at end of file
+orderedmultidict.egg-info/top_level.txt
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orderedmultidict-1.0.1/setup.py 
new/orderedmultidict-1.0.2/setup.py
--- old/orderedmultidict-1.0.1/setup.py 2018-12-11 02:30:26.000000000 +0100
+++ new/orderedmultidict-1.0.2/setup.py 2022-12-23 07:53:59.000000000 +0100
@@ -47,6 +47,11 @@
     """
     Run the unit tests.
 
+    To test all supported Python versions (as specified in tox.ini) in
+    parallel, run
+
+      $ tox -p
+
     By default, `python setup.py test` fails if tests/ isn't a Python
     module (that is, if the tests/ directory doesn't contain an
     __init__.py file). But the tests/ directory shouldn't contain an
@@ -93,6 +98,9 @@
     long_description=long_description,
     packages=find_packages(),
     include_package_data=True,
+    package_data={
+        "orderedmultidict": ["py.typed"],
+    },
     platforms=['any'],
     classifiers=[
         'Topic :: Software Development :: Libraries',
@@ -101,13 +109,12 @@
         'Intended Audience :: Developers',
         'Development Status :: 5 - Production/Stable',
         'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.4',
-        'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: 3.9',
         'Programming Language :: Python :: Implementation :: PyPy',
     ],
     install_requires=required,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orderedmultidict-1.0.1/tests/test_itemlist.py 
new/orderedmultidict-1.0.2/tests/test_itemlist.py
--- old/orderedmultidict-1.0.1/tests/test_itemlist.py   2019-01-08 
07:54:36.000000000 +0100
+++ new/orderedmultidict-1.0.2/tests/test_itemlist.py   1970-01-01 
01:00:00.000000000 +0100
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-
-#
-# omdict - Ordered Multivalue Dictionary.
-#
-# Ansgar Grunseid
-# grunseid.com
-# [email protected]
-#
-# License: Build Amazing Things (Unlicense)
-#
-
-from __future__ import absolute_import
-
-import unittest
-
-from six.moves import zip
-
-from orderedmultidict.itemlist import itemlist
-
-_unique = object()
-
-
-class TestItemList(unittest.TestCase):
-
-    def setUp(self):
-        self.inits = [
-            [], [(0, 0)], [(0, 0), (0, 0), (None, None)], [
-                (0, 0), (1, 1), (2, 2)],
-            [(True, False)], [(False, True)], [
-                (object(), object()), (object(), object())],
-            [('p', 'pumps'), ('d', 'dumps')],
-        ]
-        self.appends = [
-            (0, 0), (1, 1), (None, None), (True, False), (object(), object())]
-
-    def test_init(self):
-        for init in self.inits:
-            il = itemlist(init)
-            assert il.items() == init
-
-    def test_append(self):
-        for init in self.inits:
-            il = itemlist(init)
-            for key, value in self.appends:
-                oldsize = len(il)
-                newnode = il.append(key, value)
-                assert len(il) == oldsize + 1
-                assert il[-1] == newnode
-
-    def test_removenode(self):
-        for init in self.inits:
-            il = itemlist(init)
-            for node, key, value in il:
-                oldsize = len(il)
-                assert node in il
-                assert il.removenode(node) == il
-                assert len(il) == oldsize - 1
-                assert node not in il
-
-    def test_clear(self):
-        for init in self.inits:
-            il = itemlist(init)
-            if len(init) > 0:
-                assert bool(il)
-            assert il.clear() == il
-            assert not il
-
-    def test_items_keys_values_iteritems_iterkeys_itervalues(self):
-        for init in self.inits:
-            il = itemlist(init)
-            iterator = zip(zip(il.items(), il.keys(), il.values()),
-                           zip(il.iteritems(), il.iterkeys(), il.itervalues()))
-            for (item1, key1, value1), (item2, key2, value2) in iterator:
-                assert item1 == item2 and key1 == key2 and value1 == value2
-
-    def test_reverse(self):
-        for init in self.inits:
-            il = itemlist(init)
-            items = il.items()
-            items.reverse()
-            assert il.reverse() == il
-            assert items == il.items()
-
-    def test_len(self):
-        for init in self.inits:
-            il = itemlist(init)
-            assert len(il) == len(init)
-            for key, value in self.appends:
-                oldsize = len(il)
-                il.append(key, value)
-                assert len(il) == oldsize + 1
-
-    def test_contains(self):
-        for init in self.inits:
-            il = itemlist(init)
-            for node, key, value in il:
-                assert node in il
-                assert (key, value) in il
-
-            assert None not in il
-            assert _unique not in il
-            assert (19283091823, 102893091820) not in il
-
-    def test_iter(self):
-        for init in self.inits:
-            il = itemlist(init)
-            for node, key, value in il:
-                assert node in il
-                assert (key, value) in il
-
-    def test_delitem(self):
-        for init in self.inits:
-            for index in [0, -1]:
-                il = itemlist(init)
-                while il:
-                    node = il[index]
-                    assert node in il
-                    del il[index]
-                    assert node not in il
-
-    def test_nonzero(self):
-        for init in self.inits:
-            il = itemlist(init)
-            if init:
-                assert il
-                il.clear()
-                assert not il
-            else:
-                assert not il
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orderedmultidict-1.0.1/tests/test_orderedmultidict.py 
new/orderedmultidict-1.0.2/tests/test_orderedmultidict.py
--- old/orderedmultidict-1.0.1/tests/test_orderedmultidict.py   2019-07-10 
22:11:37.000000000 +0200
+++ new/orderedmultidict-1.0.2/tests/test_orderedmultidict.py   1970-01-01 
01:00:00.000000000 +0100
@@ -1,926 +0,0 @@
-# -*- coding: utf-8 -*-
-
-#
-# omdict - Ordered Multivalue Dictionary.
-#
-# Ansgar Grunseid
-# grunseid.com
-# [email protected]
-#
-# License: Build Amazing Things (Unlicense)
-#
-
-from __future__ import absolute_import
-
-import unittest
-from itertools import product, repeat
-
-import six
-from six.moves import map, zip, zip_longest
-
-from orderedmultidict.orderedmultidict import omdict
-
-try:
-    from collections import OrderedDict as odict  # Python 2.7+.
-except ImportError:
-    from ordereddict import OrderedDict as odict  # Python 2.4-2.6.
-
-_unique = object()
-
-
-def callable_attr(o, attr):
-    return hasattr(o, attr) and callable(getattr(o, attr))
-
-
-def is_iterator(i):
-    return callable_attr(i, 'next') or callable_attr(i, '__next__')
-
-
-# Utility list subclass to expose items() and iteritems() methods on basic
-# lists. This provides a common iteration interface for lists and dictionaries
-# for looping through their items without having to test for and maintain two
-# separate bodies, one for lists and one for dictionaries.
-#
-# So instead of requiring two bodies, one for lists and one for dicts
-#
-#  lists = [[(1,1),(2,2)]]
-#  dicts = [{1:1,2:2}]
-#  for lst in lists:
-#    lst == ...
-#  for dic in dicts:
-#    dic.items() == ...
-#
-# list and dictionary looping bodies can be merged with itemlist
-#
-#  itemlist = [itemlist([(1,1),(2,2)]), {1:1,2:2}]
-#  for ilist in itemlist:
-#    ilist.items() == ...
-#
-
-
-class itemlist(list):
-
-    def items(self):
-        return self
-
-    def iteritems(self):
-        return iter(self)
-
-
-class TestOmdict(unittest.TestCase):
-
-    def setUp(self):
-        self.inits = [
-            {}, {1: 1}, {1: 1, 2: 2, 3: 3}, {None: None}, {
-                None: None, 1: 1, 2: 2}, {False: False},
-        ]
-        self.inits += list(map(itemlist, [
-            [], [(1, 1)], [(1, 1), (2, 2)], [(1, 1), (2, 2), (1, 1)],
-            [(1, 1), (1, 1), (1, 1)], [(None, None), (None, None)],
-            [(False, False)],
-            [(None, 1), (1, None), (None, None), (None, 1), (1, None)],
-        ]))
-
-        # Updates to test update() and updateall().
-        self.updates = [
-            {}, {7: 7}, {7: 7, 8: 8, 9: 9}, {None: None}, {1: 1, 2: 2}]
-        self.updates += list(map(itemlist, [
-            [], [(7, 7)], [(7, 7), (8, 8), (9, 9)], [(None, 'none')],
-            [(9, 9), (1, 2)], [(7, 7), (7, 7), (8, 8), (7, 77)],
-            [(1, 11), (1, 111), (1, 1111), (2, 22),
-                (2, 222), ('a', 'a'), ('a', 'aa')],
-        ]))
-
-        self.keyword_updates = [
-            {}, {'1': 1}, {'1': 1, '2': 2}, {
-                'sup': 'pumps', 'scewps': None}, {'aa': 'aa'},
-        ]
-
-        # Items not initially in any of the multidict inputs self.inits.
-        self.nonitems = [
-            (44, 44), (None, 44), (55, None), ('a', 'b'), (11, 11), (22, 22)]
-
-        # Keys not initially in any of the multidict inputs self.inits or in
-        # self.nonitems.
-        self.nonkeys = [_unique, 'asdfasdosduf', 'oaisfiapsn', 'ioausopdaui']
-
-        self.valuelist = [1, 2, 3, None, 'a', 'b', object()]
-
-    def test_init(self):
-        for init in self.inits:
-            omd = omdict(init)
-            assert omd.allitems() == list(init.items())
-
-            omd1 = omdict(init)
-            omd2 = omdict(omd1)
-            assert omd1.allitems() == list(omd2.allitems())
-
-        # Support both *args and **kwargs dictionary initialization.
-        items = [('sape', 4139), ('guido', 4127), ('jack', 4098)]
-        assert omdict(items).allitems() == items
-        omd_item_set = set(omdict(sape=4139, guido=4127, jack=4098).items())
-        assert omd_item_set == set(items)  # Keyword order isn't preserved.
-
-    def test_load(self):
-        omd = omdict()
-        for init in self.inits:
-            assert omd.load(init) == omd
-            assert omd.allitems() == list(init.items())
-
-    def test_copy(self):
-        for init in self.inits:
-            omd = omdict(init)
-            copy = omd.copy()
-            assert omd is not copy and omd == copy
-
-    def test_clear(self):
-        for init in self.inits:
-            omd = omdict(init)
-            omd.clear()
-            assert omd.items() == []
-
-    def test_fromkeys(self):
-        for init in self.inits:
-            keys = [key for key, value in init.items()]
-            allitems = omdict.fromkeys(keys, _unique).allitems()
-            assert allitems == list(zip(keys, repeat(_unique)))
-
-    def test_has_key(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key, value in init.items():
-                assert key in omd
-
-    def test_update(self):
-        # Some manual tests.
-        omd = omdict()
-        omd.update([(1, 1), (1, 11), (2, 2), (3, 3), (1, 111), (2, 22)])
-        assert omd.allitems() == [(1, 111), (2, 22), (3, 3)]
-
-        omd = omdict([(1, 1), (1, 11), (2, 2), (3, 3), (1, 111), (2, 22)])
-        omd.update({1: None, 2: None, 3: None})
-        assert omd.allitems() == [(1, None), (2, None), (3, None)]
-
-        for init in self.inits:
-            zipped = zip(self.updates, self.keyword_updates)
-            for update, keyword_update in zipped:
-                omd1, omd2, omd3 = omdict(init), omdict(init), omdict(init)
-                oldomd = omd1.copy()
-                # Reduce the update to just the final items that will be
-                # present post update(), where repeated keys will be reduced to
-                # their last occurring value. For example, [(7,7),(7,8)] would
-                # be reduced to [(7,8)].
-                reduced = [
-                    i for i in update.items() if i in odict(update).items()]
-
-                # Update with a dictionary.
-                omd1.update(update)
-                # Update with keyword expansion.
-                omd2.update(**keyword_update)
-                # Update with both a dictionary and keyword expansion.
-                omd3.update(update, **keyword_update)
-
-                # Verification.
-                if update or keyword_update:
-                    for key, value in reduced:
-                        assert key in omd1 and key in omd3
-                    for key, value in keyword_update.items():
-                        assert key in omd2 and key in omd3
-                else:
-                    assert omd1 == omd2 == omd3 == oldomd
-
-    def test_updateall(self):
-        # Some manual tests.
-        omd = omdict([(1, 1), (1, 11), (2, 2), (3, 3), (1, 111), (2, 22)])
-        omd.updateall({1: None, 2: None, 3: None})
-        assert omd.allitems() == [(1, None), (2, None), (3, None)]
-
-        omd = omdict([(1, 1), (1, 11), (2, 2), (3, 3), (1, 111), (2, 22)])
-        omd.updateall([(1, None), (2, None), (3, None), (1, None), (2, None)])
-        assert omd.allitems() == [
-            (1, None), (1, None), (2, None), (3, None), (2, None)]
-
-        omd = omdict([(1, 1), (1, 11), (2, 2), (3, 3), (1, 111), (2, 22)])
-        omd.updateall([(1, None), (1, None), (1, None), (2, None)])
-        assert omd.allitems() == [
-            (1, None), (1, None), (2, None), (3, 3), (1, None)]
-
-        for init in self.inits:
-            zipped = zip(self.updates, self.keyword_updates)
-            for update, keyword_update in zipped:
-                omd1, omd2, omd3 = omdict(init), omdict(init), omdict(init)
-                oldomd = omd1.copy()
-
-                # Update with a dictionary.
-                omd1.updateall(update)
-                # Update with keyword expansion.
-                omd2.updateall(**keyword_update)
-                # Update with both a dictionary and keyword expansion.
-                omd3.updateall(update, **keyword_update)
-
-                # Verification.
-                if update or keyword_update:
-                    for key, value in six.iteritems(update):
-                        assert key in omd1 and key in omd3
-                        assert value in omd1.getlist(
-                            key) and value in omd3.getlist(key)
-                    for key, value in keyword_update.items():
-                        assert key in omd2 and key in omd3
-                        assert omd2.getlist(
-                            key) == omd3.getlist(key) == [value]
-                else:
-                    assert omd1 == omd2 == oldomd
-
-    def test_get(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key in omd.iterkeys():
-                assert omd.get(key) == omd[key]
-            for nonkey in self.nonkeys:
-                assert omd.get(nonkey) is None
-                assert omd.get(nonkey, _unique) == _unique
-
-    def test_getlist(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key in omd:
-                assert omd.getlist(
-                    key) == [v for k, v in omd.allitems() if k == key]
-            for nonkey in self.nonkeys:
-                assert omd.getlist(nonkey) == []
-                assert omd.getlist(nonkey, _unique) == _unique
-
-    def test_setdefault(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key in omd.iterkeys():
-                assert omd.setdefault(key, _unique) == omd[key]
-            for nonkey in self.nonkeys:
-                assert omd.setdefault(nonkey) is None
-                assert omd[nonkey] is None
-            omd.load(init)
-            for nonkey in self.nonkeys:
-                assert omd.setdefault(nonkey, 123456) == 123456
-                assert omd[nonkey] == 123456
-
-    def test_setdefaultlist(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key in omd.iterkeys():
-                assert omd.setdefaultlist(key, _unique) == omd.getlist(key)
-            for nonkey in self.nonkeys:
-                assert omd.setdefaultlist(nonkey) == [None]
-                assert omd.getlist(nonkey) == [None]
-            omd.load(init)
-            for nonkey in self.nonkeys:
-                assert omd.setdefaultlist(nonkey, [1, 2, 3]) == [1, 2, 3]
-                assert omd.getlist(nonkey) == [1, 2, 3]
-
-        # setdefaultlist() with an empty list of values does nothing.
-        for init in self.inits:
-            omd = omdict(init)
-            for key in omd.iterkeys():
-                values = omd.getlist(key)
-                assert key in omd
-                assert omd.setdefaultlist(key, []) == values
-                assert key in omd and omd.getlist(key) == values
-            for nonkey in self.nonkeys:
-                assert nonkey not in omd
-                assert omd.setdefaultlist(nonkey, []) == []
-                assert nonkey not in omd
-
-    def test_add(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key, value in self.nonitems:
-                assert (key, value) not in omd.allitems()
-                assert omd.add(key, value) == omd
-                assert omd.getlist(key)[-1] == value
-                assert omd.allitems()[-1] == (key, value)
-
-            # Repeat the add() calls with the same items and make sure the old
-            # items aren't replaced.
-            oldomd = omd.copy()
-            for key, value in self.nonitems:
-                assert (key, value) in omd.allitems()
-                assert omd.add(key, value) == omd
-                assert len(omd.getlist(key)) == len(oldomd.getlist(key)) + 1
-                assert omd.getlist(key)[-1] == value
-                assert omd.allitems()[-1] == (key, value)
-
-            # Assert that containers are valid values, too, not just immutables
-            # like integers.
-            assert omd.add(_unique, self.updates) == omd
-            assert omd.getlist(_unique)[-1] == self.updates
-            assert omd.allitems()[-1] == (_unique, self.updates)
-
-            # Add() doesn't require a value, and when one isn't provided it
-            # defaults to None.
-            omd = omdict(init)
-            assert omd.add(_unique) == omd
-            assert _unique in omd and omd[_unique] is None
-
-    def test_addlist(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for nonkey in self.nonkeys:
-                assert (nonkey, self.valuelist) not in omd.allitems()
-                assert omd.addlist(nonkey, self.valuelist) == omd
-                assert omd.getlist(nonkey) == self.valuelist
-                assert (omd.allitems()[-1 * len(self.valuelist):] ==
-                        list(zip(repeat(nonkey), self.valuelist)))
-
-            # Repeat the addlist() calls with the same items and make sure the
-            # old items aren't replaced.
-            oldomd = omd.copy()
-            for nonkey in self.nonkeys:
-                for value in self.valuelist:
-                    assert (nonkey, value) in omd.allitems()
-                assert omd.addlist(nonkey, self.valuelist) == omd
-                assert len(omd.getlist(nonkey)) == (
-                    len(oldomd.getlist(nonkey)) + len(self.valuelist))
-                assert omd.getlist(nonkey) == oldomd.getlist(
-                    nonkey) + self.valuelist
-                assert (omd.allitems()[-1 * len(self.valuelist):] ==
-                        list(zip(repeat(nonkey), self.valuelist)))
-
-            # If an empty list is provided to addlist(), nothing is added.
-            omd = omdict(init)
-            for nonkey in self.nonkeys:
-                assert omd.addlist(nonkey) == omd and nonkey not in omd
-                assert omd.addlist(nonkey, []) == omd and nonkey not in omd
-
-    def test_setlist(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key in (omd.keys() + self.nonkeys):
-                if key in omd:
-                    assert omd.getlist(key) != self.valuelist
-                assert omd.setlist(key, self.valuelist)
-                assert key in omd and omd.getlist(key) == self.valuelist
-
-        # Setting a key to an empty list is identical to deleting the key.
-        for init in self.inits:
-            omd = omdict(init)
-            for nonkey in self.nonkeys:
-                assert nonkey not in omd
-                omd.setlist(nonkey, [])
-                assert nonkey not in omd
-            for key in omd.keys():
-                assert key in omd
-                omd.setlist(key, [])
-                assert key not in omd
-            assert not omd
-
-    def test_removevalues(self):
-        for init in self.inits:
-            omd = omdict(init)
-            removevals = omd.removevalues  # Shorten to linewrap for PEP 8.
-            for nonkey in self.nonkeys:
-                obj = object()
-                values = [1, 1.1, '1.1', (), [], {}, obj, 5.5, '1.1']
-
-                assert removevals(nonkey, []).getlist(nonkey) == []
-                assert removevals(nonkey, values).getlist(nonkey) == []
-
-                omd.addlist(nonkey, values).removevalues(nonkey, [])
-                assert omd.getlist(nonkey) == values
-                assert removevals(nonkey, values).getlist(nonkey) == []
-
-                omd.addlist(nonkey, values)
-                assert (removevals(nonkey, [1]).getlist(nonkey) ==
-                        [1.1, '1.1', (), [], {}, obj, 5.5, '1.1'])
-                assert (removevals(nonkey, ['1.1', obj]).getlist(nonkey) ==
-                        [1.1, (), [], {}, 5.5])
-                assert (removevals(nonkey, [[], 5.5, ()]).getlist(nonkey) ==
-                        [1.1, {}])
-                assert removevals(nonkey, [{}]).getlist(nonkey) == [1.1]
-                assert removevals(nonkey, [1.1]).getlist(nonkey) == []
-                assert removevals(
-                    nonkey, [9, 9.9, 'nope']).getlist(nonkey) == []
-
-    def test_pop(self):
-        self._test_pop_poplist(lambda omd, key: omd.get(key) == omd.pop(key))
-
-    def test_poplist(self):
-        self._test_pop_poplist(
-            lambda omd, key: omd.getlist(key) == omd.poplist(key))
-
-    def _test_pop_poplist(self, assert_lambda):
-        for init in self.inits:
-            omd = omdict(init)
-            items = omd.items()
-            for key in list(omd.keys()):
-                assert assert_lambda(omd, key)
-                newitems = [item for item in items if item[0] != key]
-                assert omd.items() == newitems
-                items = newitems
-
-            omd.load(init)
-            for nonkey in self.nonkeys:
-                self.assertRaises(KeyError, omd.pop, nonkey)
-                assert omd.pop(nonkey, _unique) == _unique
-                self.assertRaises(KeyError, omd.poplist, nonkey)
-                assert omd.poplist(nonkey, _unique) == _unique
-
-    def test_popvalue(self):
-        # popvalue() with no value provided.
-        for init in self.inits:
-            for last in [True, False]:
-                omd = omdict(init)
-                allitems = omd.allitems()
-                while omd.keys():
-                    for key in omd.keys():
-                        if last:
-                            value = omd.getlist(key)[-1]
-                            _rremove(allitems, (key, value))
-                        else:
-                            value = omd[key]
-                            allitems.remove((key, value))
-
-                        assert value == omd.popvalue(key, last=last)
-                        assert omd.allitems() == allitems
-
-            omd.load(init)
-            for nonkey in self.nonkeys:
-                self.assertRaises(KeyError, omd.popvalue, nonkey)
-                assert omd.popvalue(nonkey, default=_unique) == _unique
-
-        # popvalue() with value provided.
-        #   last = True (default).
-        omd = omdict([(1, 1), (2, 2), (3, 3), (2, 2), (3, 3), (2, 2)])
-        assert omd.popvalue(2, 2) == 2
-        assert omd.allitems() == [(1, 1), (2, 2), (3, 3), (2, 2), (3, 3)]
-        assert omd.popvalue(2, 2) == 2
-        assert omd.allitems() == [(1, 1), (2, 2), (3, 3), (3, 3)]
-        assert omd.popvalue(2, 2) == 2
-        assert omd.allitems() == [(1, 1), (3, 3), (3, 3)]
-        #   last = False.
-        omd = omdict([(3, 3), (2, 2), (3, 3), (2, 2), (3, 3), (2, 2)])
-        assert omd.popvalue(2, 2, last=True) == 2
-        assert omd.allitems() == [(3, 3), (2, 2), (3, 3), (2, 2), (3, 3)]
-        assert omd.popvalue(2, 2, last=True) == 2
-        assert omd.allitems() == [(3, 3), (2, 2), (3, 3), (3, 3)]
-        assert omd.popvalue(2, 2, last=True) == 2
-        assert omd.allitems() == [(3, 3), (3, 3), (3, 3)]
-
-        # Invalid key.
-        self.assertRaises(KeyError, omd.popvalue, _unique, _unique)
-        self.assertRaises(KeyError, omd.popvalue, _unique, 2)
-        self.assertRaises(KeyError, omd.popvalue, _unique, 22)
-        self.assertRaises(KeyError, omd.popvalue, _unique, _unique, last=False)
-        self.assertRaises(KeyError, omd.popvalue, _unique, 2)
-        self.assertRaises(KeyError, omd.popvalue, _unique, 22)
-        assert omd.popvalue(_unique, _unique, 'sup') == 'sup'
-        assert omd.popvalue(_unique, 2, 'sup') == 'sup'
-        assert omd.popvalue(_unique, 22, 'sup') == 'sup'
-
-        # Valid key, invalid value.
-        self.assertRaises(ValueError, omd.popvalue, 3, _unique)
-        self.assertRaises(ValueError, omd.popvalue, 3, _unique, False)
-
-    def test_popitem(self):
-        for init in self.inits:
-            # All permutations of booleans <fromall> and <last>.
-            for fromall, last in product([True, False], repeat=2):
-                omd = omdict(init)
-                allitems = omd.allitems()
-                while omd.allitems():
-                    if fromall:
-                        key, value = omd.allitems()[-1 if last else 0]
-                    else:
-                        key = omd.keys()[-1 if last else 0]
-                        value = omd[key]
-
-                    popkey, popvalue = omd.popitem(fromall=fromall, last=last)
-                    assert popkey == key and popvalue == value
-
-                    if fromall:
-                        if last:
-                            _rremove(allitems, (key, value))
-                        else:
-                            allitems.remove((key, value))
-                    else:
-                        allitems = [(k, v) for k, v in allitems if k != key]
-                    assert omd.allitems() == allitems
-
-            omd = omdict()
-            self.assertRaises(KeyError, omd.popitem)
-
-    def test_poplistitem(self):
-        for init in self.inits:
-            for last in [True, False]:
-                omd, omdcopy = omdict(init), omdict(init)
-                while omd.keys():
-                    key, valuelist = omd.poplistitem(last=last)
-                    assert key == omdcopy.keys()[-1 if last else 0]
-                    assert valuelist == omdcopy.getlist(key)
-                    omdcopy.pop(omdcopy.keys()[-1 if last else 0])
-
-                # poplistitem() on an empty omdict.
-                self.assertRaises(KeyError, omd.poplistitem)
-
-    # Tests every non-'all' items, keys, values, lists method: items(), keys(),
-    # values(), lists(), listitems() and their iterators iteritems(),
-    # iterkeys(), itervalues(), iterlists(), and iterlistitems().
-    def test_nonall_item_key_value_lists(self):
-        for init in self.inits:
-            dic = odict(init.items())
-            omd = omdict(init.items())
-
-            # Testing items(), keys(), values(), lists(), and listitems().
-            assert omd.items() == list(dic.items())
-            assert omd.keys() == list(dic.keys())
-            assert omd.values() == list(dic.values())
-            iterator = zip(omd.keys(), omd.lists(), omd.listitems())
-            for key, valuelist, listitem in iterator:
-                assert omd.values(key) == omd.getlist(key) == valuelist
-                assert omd.items(
-                    key) == [i for i in init.items() if i[0] == key]
-                assert listitem == (key, valuelist)
-
-            # Testing iteritems(), iterkeys(), itervalues(), and iterlists().
-            assert is_iterator(omd.iterkeys())
-            for key1, key2 in zip(omd.iterkeys(), six.iterkeys(dic)):
-                assert key1 == key2
-            assert is_iterator(omd.itervalues())
-            for val1, val2 in zip(omd.itervalues(), six.itervalues(dic)):
-                assert val1 == val2
-            assert is_iterator(omd.iteritems())
-            for item1, item2 in zip(omd.iteritems(), six.iteritems(dic)):
-                assert item1 == item2
-            assert is_iterator(omd.iterlists())
-            for key, values in zip(six.iterkeys(omd), omd.iterlists()):
-                assert omd.getlist(key) == values
-            assert is_iterator(omd.iterlistitems())
-            iterator = zip(
-                omd.iterkeys(), omd.iterlists(), omd.iterlistitems())
-            for key, valuelist, listitem in iterator:
-                assert listitem == (key, valuelist)
-
-            # Test iteritems() and itervalues() with a key.
-            for key in omd.iterkeys():
-                assert is_iterator(omd.iteritems(key))
-                assert list(omd.iteritems(key)) == list(zip(
-                    repeat(key), omd.getlist(key)))
-                assert is_iterator(omd.itervalues(key))
-                assert list(omd.itervalues(key)) == omd.getlist(key)
-            for nonkey in self.nonkeys:
-                self.assertRaises(KeyError, omd.iteritems, nonkey)
-                self.assertRaises(KeyError, omd.itervalues, nonkey)
-
-    # Tests every 'all' items, keys, values method: allitems(), allkeys(),
-    # allvalues() and their iterators iterallitems(), iterallkeys(),
-    # iterallvalues().
-    def test_all_items_keys_values_iterall_items_keys_values(self):
-        for init in self.inits:
-            omd = omdict(init)
-            # map(list, zip(*lst)) - doesn't work if lst is empty, lst == [].
-            keys = [key for key, value in init.items()]
-            values = [value for key, value in init.items()]
-
-            # Test allitems(), allkeys(), allvalues().
-            assert omd.allitems() == list(init.items())
-            assert omd.allkeys() == keys
-            assert omd.allvalues() == values
-
-            # Test iterallitems(), iterallkeys(), iterallvalues().
-            for key1, key2 in zip(omd.iterallkeys(), keys):
-                assert key1 == key2
-            for val1, val2 in zip(omd.iterallvalues(), values):
-                assert val1 == val2
-            for item1, item2 in zip(omd.iterallitems(), init.items()):
-                assert item1 == item2
-
-            # Test allitems(), allvalues(), iterallitems() and iterallvalues()
-            # with a key.
-            for key in omd.iterkeys():
-                assert (omd.allvalues(key) == list(omd.iterallvalues(key)) ==
-                        omd.getlist(key))
-                assert (omd.allitems(key) == list(omd.iterallitems(key)) ==
-                        list(zip(repeat(key), omd.getlist(key))))
-            for nonkey in self.nonkeys:
-                self.assertRaises(KeyError, omd.allvalues, nonkey)
-                self.assertRaises(KeyError, omd.allitems, nonkey)
-                self.assertRaises(KeyError, omd.iterallvalues, nonkey)
-                self.assertRaises(KeyError, omd.iterallitems, nonkey)
-
-    def test_reverse(self):
-        for init in self.inits:
-            reversed = list(init.items())[::-1]
-            assert omdict(init).reverse().allitems() == reversed
-
-    def test_eq(self):
-        for init in self.inits:
-            d, omd = dict(init), omdict(init)
-            assert d == omd
-            assert omd == omd
-            assert omd == omd.copy()
-
-    def test_ne(self):
-        diff = omdict([(_unique, _unique)])
-        for init in self.inits:
-            assert omdict(init) != diff
-            # Compare to basic types.
-            for basic in [1, 1.1, '1.1', (), [], object()]:
-                assert omdict(init) != basic
-
-    def test_len(self):
-        for init in self.inits:
-            assert len(omdict(init)) == len(dict(init))
-
-    def test_size(self):
-        for init in self.inits:
-            assert omdict(init).size() == len(init)
-
-    def test_iter(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key1, key2 in zip_longest(iter(omd), omd.iterkeys()):
-                assert key1 == key2
-
-    def test_contains(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key, value in init.items():
-                assert key in omd
-
-    def test_getitem(self):
-        for init in self.inits:
-            dic = dict(init)
-            omd = omdict(init)
-            for key in omd.iterkeys():
-                assert omd[key] == dic[key]
-
-        omd = omdict()
-        self.assertRaises(KeyError, omd.__getitem__, _unique)
-
-    def test_set_setitem(self):
-        for init in self.inits:
-            omd = omdict()
-            omd2 = omdict()
-            for key, value in init.items():
-                omd[key] = value
-                assert omd2.set(key, value) == omd2
-                assert omd == omd2 and omd[key] == value
-
-            # Store containers as values, not just immutables like integers.
-            omd[_unique] = self.valuelist
-            assert omd2.set(_unique, self.valuelist) == omd2
-            assert omd == omd2 and omd[_unique] == self.valuelist
-
-    def test_delitem(self):
-        for init in self.inits:
-            omd = omdict(init)
-            for key in list(omd.keys()):
-                assert key in omd
-                del omd[key]
-                assert key not in omd
-
-    def test_nonzero(self):
-        for init in self.inits:
-            if init:
-                assert omdict(init)
-            else:
-                assert not omdict(init)
-
-    def test_str(self):
-        for init in self.inits:
-            omd = omdict(init)
-            s = '{%s}' % ', '.join(
-                map(lambda p: '%s: %s' % (p[0], p[1]), omd.allitems()))
-            assert s == str(omd)
-
-    def test_odict_omdict_parity(self):
-        for init in self.inits:
-            d = odict(init)
-            omd = omdict(init)
-
-            self._compare_odict_and_omddict(d, omd)
-            self._compare_odict_and_omddict(d.copy(), omd.copy())  # copy().
-            d.clear(), omd.clear()  # clear().
-            self._compare_odict_and_omddict(d, omd)
-
-            assert dict().update(init) == omdict().update(init)  # update().
-            dict_fromkeys = list(d.fromkeys(init).items())
-            omdict_fromkeys = list(omd.fromkeys(init).items())
-            assert dict_fromkeys == omdict_fromkeys  # fromkeys()
-
-    def _compare_odict_and_omddict(self, d, omd):
-        assert len(d) == len(omd)  # __len__().
-
-        # __contains__(), has_key(), get(), and setdefault().
-        for dkey, omdkey in zip(d, omd):
-            assert dkey == omdkey and dkey in d and omdkey in omd
-            assert dkey in d and omdkey in omd
-            assert d.get(dkey) == omd.get(omdkey)
-            d.setdefault(dkey, _unique)
-            omd.setdefault(omdkey, _unique)
-            assert d.get(dkey) == omd.get(omdkey) and d.get(dkey) != _unique
-        for nonkey in self.nonkeys:
-            assert d.get(nonkey) == omd.get(nonkey) is None
-            d.setdefault(nonkey, _unique)
-            omd.setdefault(nonkey, _unique)
-            assert d.get(nonkey) == omd.get(nonkey) == _unique
-
-        # items(), keys, values(), iteritems(), iterkeys, and itervalues().
-        iterators = [
-            zip(d.items(), omd.items(), d.keys(), omd.keys(),
-                d.values(), omd.values()),
-            zip(six.iteritems(d), six.iteritems(omd), six.iterkeys(d),
-                six.iterkeys(omd), six.itervalues(d), six.itervalues(omd))]
-        for iterator in iterators:
-            for ditem, omditem, dkey, omdkey, dvalue, omdvalue in iterator:
-                assert dkey == omdkey
-                assert ditem == omditem
-                assert dvalue == omdvalue
-
-        # pop().
-        dcopy, omdcopy = d.copy(), omd.copy()
-        while dcopy and omdcopy:
-            dpop = dcopy.pop(list(dcopy.keys())[0])
-            omdpop = omdcopy.pop(list(omdcopy.keys())[0])
-            assert dpop == omdpop
-        # popitem().
-        dcopy, omdcopy = d.copy(), omd.copy()
-        while dcopy and omdcopy:
-            assert dcopy.popitem() == omdcopy.popitem()
-
-        # __getitem__().
-        for dkey, omdkey in zip(six.iterkeys(d), six.iterkeys(omd)):
-            assert d[dkey] == omd[omdkey]
-        # __setitem__().
-        for dkey, omdkey in zip(d, omd):
-            d[dkey] = _unique
-            omd[omdkey] = _unique
-            assert dkey == omdkey and d[dkey] == omd[omdkey]
-        # __delitem__().
-        while d and omd:
-            dkey, omdkey = list(d.keys())[0], list(omd.keys())[0]
-            del d[dkey]
-            del omd[omdkey]
-            assert dkey == omdkey and dkey not in d and omdkey not in omd
-
-    def test_fundamentals(self):
-        # Gets, sets, and pops.
-        omd = omdict()
-        omd[1] = 1
-        omd[2] = 2
-        assert omd.allitems() == [(1, 1), (2, 2)]
-        omd[1] = 11
-        assert omd.allitems() == [(1, 11), (2, 2)]
-        omd.add(1, 1.1)
-        assert omd.allitems() == [(1, 11), (2, 2), (1, 1.1)]
-        assert omd.popvalue(1) == 1.1
-        assert omd.allitems() == [(1, 11), (2, 2)]
-        omd.popvalue(2)
-        assert omd.allitems() == [(1, 11)]
-        omd[2] = [2, 2]
-        assert omd.allitems() == [(1, 11), (2, [2, 2])]
-        omd[1] = None
-        assert omd.allitems() == [(1, None), (2, [2, 2])]
-        omd.add(2, None)
-        assert omd.allitems() == [(1, None), (2, [2, 2]), (2, None)]
-        del omd[2]
-        assert omd.allitems() == [(1, None)]
-        omd[3] = 3
-        assert omd.allitems() == [(1, None), (3, 3)]
-        omd.setlist(1, [1, 11, 111])
-        assert omd.allitems() == [(1, 1), (3, 3), (1, 11), (1, 111)]
-        omd.addlist(1, [1111])
-        omd = omdict([(1, 1), (3, 3), (1, 11), (1, 111), (1, 1111)])
-        assert omd.allitems() == [(1, 1), (3, 3), (1, 11), (1, 111), (1, 1111)]
-        omd[1] = None
-        assert omd.allitems() == [(1, None), (3, 3)]
-
-    def test_pops(self):
-        init = [(1, 1), (2, 2), (1, 1), (1, 2), (1, 3)]
-
-        # pop().
-        omd = omdict(init)
-        assert omd.pop(1) == 1
-        assert omd.allitems() == [(2, 2)]
-        assert omd.pop(_unique, 'sup') == 'sup'
-
-        # poplist().
-        omd = omdict(init)
-        assert omd.poplist(1) == [1, 1, 2, 3]
-        assert omd.allitems() == [(2, 2)]
-        self.assertRaises(KeyError, omd.poplist, _unique)
-        assert omd.poplist(_unique, 'sup') == 'sup'
-
-        # popvalue().
-        omd = omdict(init)
-        assert omd.popvalue(1) == 3
-        assert omd.allitems() == [(1, 1), (2, 2), (1, 1), (1, 2)]
-        self.assertRaises(KeyError, omd.popvalue, _unique)
-        assert omd.popvalue(_unique, default='sup') == 'sup'
-        assert omd.popvalue(1, last=False) == 1
-        assert omd.allitems() == [(2, 2), (1, 1), (1, 2)]
-
-        # popitem().
-        omd = omdict(init)
-        assert omd.popitem() == (2, 2)
-        assert omd.allitems() == [(1, 1), (1, 1), (1, 2), (1, 3)]
-        assert omd.popitem() == (1, 1)
-        assert omd.allitems() == []
-        omd = omdict(init)
-        assert omd.popitem(fromall=True) == (1, 3)
-        assert omd.allitems() == [(1, 1), (2, 2), (1, 1), (1, 2)]
-        assert omd.popitem(fromall=True, last=False) == (1, 1)
-        assert omd.allitems() == [(2, 2), (1, 1), (1, 2)]
-
-    def test_splats(self):
-        items = [('1', 1), ('2', 2), ('3', 3)]
-        omd = omdict(items)
-
-        def splat(*args, **kwargs):
-            return args, set(kwargs.items())
-
-        assert splat(*omd, **omd) == (tuple(i[0] for i in items), set(items))
-
-
-class TestBinaryOperators(unittest.TestCase):
-
-    @property
-    def _items(self):
-        original = (1, ['a']), (2, 'b')
-        one_different = (1, ['a']), (3, 'd')
-        all_different = (1, 'c'), (3, 'd')
-        duplicate_key = (1, ['a']), (1, 'e')
-        empty = tuple()
-        return original, one_different, all_different, duplicate_key, empty
-
-    @property
-    def _or_params(self):
-        original, one_diff, all_diff, duplicate_key, empty = self._items
-        return [
-            # self, other, other as dict, other as omdict.
-            (original, original, original + original, original + original),
-            (original, one_diff, original + one_diff, original + one_diff),
-            (original, all_diff, original + all_diff, original + all_diff),
-            (original, duplicate_key, original + ((1, 'e'),), original + 
duplicate_key),
-            (original, empty, original, original),
-        ]
-
-    def test_or(self):
-        for s, t, d, o in self._or_params:
-            assert omdict(s) | dict(t) == omdict(d)
-            assert omdict(s) | omdict(t) == omdict(o)
-
-    def test_ior(self):
-        for s, t, d, o in self._or_params:
-            # Test with dict.
-            a = omdict(s)
-            a |= dict(t)
-            assert a == omdict(d)
-            # Test with omdict.
-            a = omdict(s)
-            a |= omdict(t)
-            assert a == omdict(o)
-
-
-class TestUtilities(unittest.TestCase):
-
-    def test_rfind(self):
-        tests = [([], 1, -1), ([1], 1, 0), ([1, 2], 2, 1),
-                 ([1, 2, 1, 2], 1, 2), ([1, 2, 3], 4, -1), ([1, 2, 3], 1, 0)]
-        for lst, item, pos in tests:
-            assert _rfind(lst, item) == pos
-
-    def test_rremove(self):
-        tests = [([1, 1], 1, [1]), ([1], 1, []), ([1, 2], 2, [1]),
-                 ([1, 2, 3], 1, [2, 3]), ([1, 2, 1, 2], 1, [1, 2, 2]),
-                 ([1, 2, 1], 1, [1, 2])]
-        for lst, item, result in tests:
-            _rremove(lst, item)
-            assert lst == result
-
-        nonitems = [None, 'asdf', object(), 1000000]
-        for nonitem in nonitems:
-            self.assertRaises(ValueError, _rremove, lst, nonitem)
-
-
-def _rfind(lst, item):
-    """
-    Returns the index of the last occurance of <item> in <lst>. Returns -1 if
-    <item> is not in <l>.
-      ex: _rfind([1,2,1,2], 1) == 2
-    """
-    try:
-        return (len(lst) - 1) - lst[::-1].index(item)
-    except ValueError:
-        return -1
-
-
-def _rremove(lst, item):
-    """
-    Removes the last occurance of <item> in <lst>, or raises a ValueError if
-    <item> is not in <list>.
-      ex: _rremove([1,2,1,2], 1) == [1,2,2]
-    """
-    pos = _rfind(lst, item)
-    if pos >= 0:
-        lst.pop(pos)
-        return lst
-    raise ValueError('_rremove(list, x): x not in list')

Reply via email to