Hello community,
here is the log from the commit of package python-orderedmultidict for
openSUSE:Factory checked in at 2019-07-28 10:17:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-orderedmultidict (Old)
and /work/SRC/openSUSE:Factory/.python-orderedmultidict.new.4126 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-orderedmultidict"
Sun Jul 28 10:17:52 2019 rev:2 rq:717900 version:1.0.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-orderedmultidict/python-orderedmultidict.changes
2019-03-22 15:01:04.853798832 +0100
+++
/work/SRC/openSUSE:Factory/.python-orderedmultidict.new.4126/python-orderedmultidict.changes
2019-07-28 10:17:57.544600911 +0200
@@ -1,0 +2,8 @@
+Tue Jul 23 13:36:15 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Update to 1.0.1:
+ * Imports overhaul
+ * py 3.8 support
+ * More tests
+
+-------------------------------------------------------------------
Old:
----
orderedmultidict-1.0.tar.gz
New:
----
orderedmultidict-1.0.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-orderedmultidict.spec ++++++
--- /var/tmp/diff_new_pack.oSF38P/_old 2019-07-28 10:17:59.060600970 +0200
+++ /var/tmp/diff_new_pack.oSF38P/_new 2019-07-28 10:17:59.064600971 +0200
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-orderedmultidict
-Version: 1.0
+Version: 1.0.1
Release: 0
Summary: Ordered Multivalue Dictionary
License: Unlicense
@@ -40,7 +40,7 @@
%prep
%setup -q -n orderedmultidict-%{version}
-sed -i 's/^.*pycodestyle.*/tests_require = []/' setup.py
+sed -i 's/^.*flake8.*/tests_require = []/' setup.py
chmod a-x README.md LICENSE.md
rm -r *.egg-info
++++++ orderedmultidict-1.0.tar.gz -> orderedmultidict-1.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/LICENSE.md
new/orderedmultidict-1.0.1/LICENSE.md
--- old/orderedmultidict-1.0/LICENSE.md 2018-01-17 08:07:15.000000000 +0100
+++ new/orderedmultidict-1.0.1/LICENSE.md 2018-06-28 07:29:05.000000000
+0200
@@ -28,4 +28,4 @@
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\
SOFTWARE.
-For more information, please refer to <http://unlicense.org/>
+For more information, please refer to <https://unlicense.org/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/PKG-INFO
new/orderedmultidict-1.0.1/PKG-INFO
--- old/orderedmultidict-1.0/PKG-INFO 2018-06-12 05:55:46.000000000 +0200
+++ new/orderedmultidict-1.0.1/PKG-INFO 2019-07-10 22:11:44.000000000 +0200
@@ -1,7 +1,7 @@
Metadata-Version: 1.1
Name: orderedmultidict
-Version: 1.0
-Summary: Ordered Multivalue Dictionary - omdict.
+Version: 1.0.1
+Summary: Ordered Multivalue Dictionary
Home-page: https://github.com/gruns/orderedmultidict
Author: Ansgar Grunseid
Author-email: [email protected]
@@ -20,9 +20,12 @@
Classifier: License :: Freely Distributable
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 :: Implementation :: PyPy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/README.md
new/orderedmultidict-1.0.1/README.md
--- old/orderedmultidict-1.0/README.md 2018-01-17 08:08:32.000000000 +0100
+++ new/orderedmultidict-1.0.1/README.md 2018-10-17 00:18:13.000000000
+0200
@@ -1,15 +1,24 @@
-# orderedmultidict
+<h1 align="center">
+ <div>
+ <img src="logo.svg" width="300px" height="300px" alt="orderedmultidict">
+ </div>
+ orderedmultidict
+</h1>
+
+<p align="center">
+ <a href="https://pypi.python.org/pypi/orderedmultidict"><img
src="https://badge.fury.io/py/orderedmultidict.svg"></a>
+ <a href="https://travis-ci.org/gruns/orderedmultidict"><img
src="https://api.travis-ci.org/gruns/orderedmultidict.svg"></a>
+ <a href="http://unlicense.org/"><img
src="https://img.shields.io/pypi/l/orderedmultidict.svg"></a>
+ <a href="https://pypi.python.org/pypi/orderedmultidict"><img
src="https://img.shields.io/pypi/pyversions/orderedmultidict.svg"></a>
+</p>
-[](https://pypi.python.org/pypi/orderedmultidict)
-[](https://travis-ci.org/gruns/orderedmultidict)
-
-### omdict is an ordered multivalue dictionary that retains method parity with
Python's [dict](http://docs.python.org/library/stdtypes.html#dict).
+### 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).
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, and\
+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.
@@ -43,7 +52,7 @@
[(2, 'sup'), (1, 1)]
```
-Method parity with dict is retained. omdict can be a drop-in replacement.
+Method parity with dict is retained; omdict can be a drop-in replacement.
```python
>>> d, omd = dict(), omdict()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/orderedmultidict/__init__.py
new/orderedmultidict-1.0.1/orderedmultidict/__init__.py
--- old/orderedmultidict-1.0/orderedmultidict/__init__.py 2018-06-12
04:37:39.000000000 +0200
+++ new/orderedmultidict-1.0.1/orderedmultidict/__init__.py 2019-01-08
07:54:23.000000000 +0100
@@ -8,14 +8,14 @@
# [email protected]
#
# License: Build Amazing Things (Unlicense)
+#
-from __future__ import absolute_import
+from os.path import dirname, join as pjoin
from .orderedmultidict import * # noqa
-__title__ = 'orderedmultidict'
-__version__ = '1.0'
-__author__ = 'Ansgar Grunseid'
-__contact__ = '[email protected]'
-__license__ = 'Unlicense'
-__url__ = 'https://github.com/gruns/orderedmultidict'
+# 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()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/orderedmultidict/__version__.py
new/orderedmultidict-1.0.1/orderedmultidict/__version__.py
--- old/orderedmultidict-1.0/orderedmultidict/__version__.py 1970-01-01
01:00:00.000000000 +0100
+++ new/orderedmultidict-1.0.1/orderedmultidict/__version__.py 2019-07-10
22:02:25.000000000 +0200
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+#
+# omdict - Ordered Multivalue Dictionary.
+#
+# Ansgar Grunseid
+# grunseid.com
+# [email protected]
+#
+# License: Build Amazing Things (Unlicense)
+#
+
+__title__ = 'orderedmultidict'
+__version__ = '1.0.1'
+__license__ = 'Unlicense'
+__author__ = 'Ansgar Grunseid'
+__contact__ = '[email protected]'
+__description__ = 'Ordered Multivalue Dictionary'
+__url__ = 'https://github.com/gruns/orderedmultidict'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/orderedmultidict/itemlist.py
new/orderedmultidict-1.0.1/orderedmultidict/itemlist.py
--- old/orderedmultidict-1.0/orderedmultidict/itemlist.py 2018-05-26
16:46:20.000000000 +0200
+++ new/orderedmultidict-1.0.1/orderedmultidict/itemlist.py 2019-01-08
07:54:17.000000000 +0100
@@ -8,6 +8,7 @@
# [email protected]
#
# License: Build Amazing Things (Unlicense)
+#
from __future__ import absolute_import
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orderedmultidict-1.0/orderedmultidict/orderedmultidict.py
new/orderedmultidict-1.0.1/orderedmultidict/orderedmultidict.py
--- old/orderedmultidict-1.0/orderedmultidict/orderedmultidict.py
2018-05-29 22:28:34.000000000 +0200
+++ new/orderedmultidict-1.0.1/orderedmultidict/orderedmultidict.py
2019-07-10 22:04:45.000000000 +0200
@@ -8,26 +8,30 @@
# [email protected]
#
# License: Build Amazing Things (Unlicense)
+#
from __future__ import absolute_import
+import sys
from itertools import chain
-from collections import MutableMapping
import six
from six.moves import map, zip_longest
from .itemlist import itemlist
+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.
except ImportError:
from ordereddict import OrderedDict as odict # Python 2.6 and earlier.
-import sys
-items_attr = 'items' if sys.version_info[0] >= 3 else 'iteritems'
_absent = object() # Marker that means no parameter was provided.
+_items_attr = 'items' if sys.version_info[0] >= 3 else 'iteritems'
def callable_attr(obj, attr):
@@ -765,7 +769,7 @@
for i1, i2 in zip_longest(myiter, otheriter, fillvalue=_absent):
if i1 != i2 or i1 is _absent or i2 is _absent:
return False
- elif not hasattr(other, '__len__') or not hasattr(other, items_attr):
+ elif not hasattr(other, '__len__') or not hasattr(other, _items_attr):
return False
# Ignore order so we can compare ordered omdicts with unordered dicts.
else:
@@ -809,3 +813,21 @@
def __repr__(self):
return '%s(%s)' % (self.__class__.__name__, self.allitems())
+
+ def __or__(self, other):
+ return self.__class__(chain(_get_items(self), _get_items(other)))
+
+ def __ior__(self, other):
+ for k, v in _get_items(other):
+ self.add(k, value=v)
+ return self
+
+
+def _get_items(mapping):
+ """Find item iterator for an object."""
+ names = ('iterallitems', 'allitems', 'iteritems', 'items')
+ exist = (n for n in names if callable_attr(mapping, n))
+ for a in exist:
+ return getattr(mapping, a)()
+ raise TypeError(
+ "Object {} has no compatible items interface.".format(mapping))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orderedmultidict-1.0/orderedmultidict.egg-info/PKG-INFO
new/orderedmultidict-1.0.1/orderedmultidict.egg-info/PKG-INFO
--- old/orderedmultidict-1.0/orderedmultidict.egg-info/PKG-INFO 2018-06-12
05:55:46.000000000 +0200
+++ new/orderedmultidict-1.0.1/orderedmultidict.egg-info/PKG-INFO
2019-07-10 22:11:44.000000000 +0200
@@ -1,7 +1,7 @@
Metadata-Version: 1.1
Name: orderedmultidict
-Version: 1.0
-Summary: Ordered Multivalue Dictionary - omdict.
+Version: 1.0.1
+Summary: Ordered Multivalue Dictionary
Home-page: https://github.com/gruns/orderedmultidict
Author: Ansgar Grunseid
Author-email: [email protected]
@@ -20,9 +20,12 @@
Classifier: License :: Freely Distributable
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 :: Implementation :: PyPy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orderedmultidict-1.0/orderedmultidict.egg-info/SOURCES.txt
new/orderedmultidict-1.0.1/orderedmultidict.egg-info/SOURCES.txt
--- old/orderedmultidict-1.0/orderedmultidict.egg-info/SOURCES.txt
2018-06-12 05:55:46.000000000 +0200
+++ new/orderedmultidict-1.0.1/orderedmultidict.egg-info/SOURCES.txt
2019-07-10 22:11:44.000000000 +0200
@@ -2,8 +2,10 @@
LICENSE.md
MANIFEST.in
README.md
+setup.cfg
setup.py
orderedmultidict/__init__.py
+orderedmultidict/__version__.py
orderedmultidict/itemlist.py
orderedmultidict/orderedmultidict.py
orderedmultidict.egg-info/PKG-INFO
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/setup.cfg
new/orderedmultidict-1.0.1/setup.cfg
--- old/orderedmultidict-1.0/setup.cfg 2018-06-12 05:55:46.000000000 +0200
+++ new/orderedmultidict-1.0.1/setup.cfg 2019-07-10 22:11:44.000000000
+0200
@@ -1,3 +1,9 @@
+[bdist_wheel]
+universal = 1
+
+[metadata]
+license_file = LICENSE.md
+
[egg_info]
tag_build =
tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/setup.py
new/orderedmultidict-1.0.1/setup.py
--- old/orderedmultidict-1.0/setup.py 2018-05-26 16:46:20.000000000 +0200
+++ new/orderedmultidict-1.0.1/setup.py 2018-12-11 02:30:26.000000000 +0100
@@ -11,16 +11,15 @@
# License: Build Amazing Things (Unlicense)
import os
-import re
import sys
from os.path import dirname, join as pjoin
from setuptools import setup, find_packages, Command
from setuptools.command.test import test as TestCommand
-with open(pjoin(dirname(__file__), 'orderedmultidict', '__init__.py')) as fd:
- VERSION = re.compile(
- r".*__version__ = '(.*?)'", re.S).match(fd.read()).group(1)
+meta = {}
+with open(pjoin('orderedmultidict', '__version__.py')) as f:
+ exec(f.read(), meta)
class Publish(Command):
@@ -34,9 +33,13 @@
pass
def run(self):
- os.system('python setup.py sdist')
- rc = os.system(
- 'twine upload dist/orderedmultidict-%s.tar.gz' % VERSION)
+ os.system('python setup.py sdist bdist_wheel')
+
+ base = 'dist/orderedmultidict'
+ sdist = '%s-%s.tar.gz' % (base, meta['__version__'])
+ wheel = '%s-%s-py2.py3-none-any.whl' % (base, meta['__version__'])
+ rc = os.system('twine upload "%s" "%s"' % (sdist, wheel))
+
sys.exit(rc)
@@ -75,18 +78,18 @@
if sys.version_info < (2, 7):
required.append('ordereddict')
-tests_require = ['pycodestyle']
+tests_require = ['flake8']
if sys.version_info[:2] < (2, 7):
tests_require += ['unittest2']
setup(
- name='orderedmultidict',
- version=VERSION,
- author='Ansgar Grunseid',
- author_email='[email protected]',
- url='https://github.com/gruns/orderedmultidict',
- license='Unlicense',
- description='Ordered Multivalue Dictionary - omdict.',
+ name=meta['__title__'],
+ version=meta['__version__'],
+ author=meta['__author__'],
+ author_email=meta['__contact__'],
+ url=meta['__url__'],
+ license=meta['__license__'],
+ description=meta['__description__'],
long_description=long_description,
packages=find_packages(),
include_package_data=True,
@@ -97,11 +100,14 @@
'License :: Freely Distributable',
'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 :: Implementation :: PyPy',
],
install_requires=required,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/tests/test_itemlist.py
new/orderedmultidict-1.0.1/tests/test_itemlist.py
--- old/orderedmultidict-1.0/tests/test_itemlist.py 2018-05-26
16:46:20.000000000 +0200
+++ new/orderedmultidict-1.0.1/tests/test_itemlist.py 2019-01-08
07:54:36.000000000 +0100
@@ -8,6 +8,7 @@
# [email protected]
#
# License: Build Amazing Things (Unlicense)
+#
from __future__ import absolute_import
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orderedmultidict-1.0/tests/test_orderedmultidict.py
new/orderedmultidict-1.0.1/tests/test_orderedmultidict.py
--- old/orderedmultidict-1.0/tests/test_orderedmultidict.py 2018-05-26
16:46:20.000000000 +0200
+++ new/orderedmultidict-1.0.1/tests/test_orderedmultidict.py 2019-07-10
22:11:37.000000000 +0200
@@ -8,6 +8,7 @@
# [email protected]
#
# License: Build Amazing Things (Unlicense)
+#
from __future__ import absolute_import
@@ -26,6 +27,15 @@
_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
@@ -530,14 +540,19 @@
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:
@@ -545,10 +560,11 @@
# 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 list(omd.iterallitems(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)
@@ -824,6 +840,46 @@
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):