Hello community, here is the log from the commit of package python-requirements-parser for openSUSE:Factory checked in at 2019-05-21 10:41:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-requirements-parser (Old) and /work/SRC/openSUSE:Factory/.python-requirements-parser.new.5148 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-requirements-parser" Tue May 21 10:41:02 2019 rev:4 rq:704268 version:0.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-requirements-parser/python-requirements-parser.changes 2015-05-16 19:01:52.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-requirements-parser.new.5148/python-requirements-parser.changes 2019-05-21 10:41:11.291055781 +0200 @@ -1,0 +2,9 @@ +Mon May 20 10:35:59 UTC 2019 - pgaj...@suse.com + +- version update to 0.2.0 + * Support multiple hashing algorithms at the end of the URL (#24) + * Preserve login info in requirement URI (#33) + * Support subdirectory fragments (#32) + * Support version control URLs with extras (#30) + +------------------------------------------------------------------- Old: ---- requirements-parser-0.1.0.tar.gz New: ---- requirements-parser-0.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-requirements-parser.spec ++++++ --- /var/tmp/diff_new_pack.t7hmcS/_old 2019-05-21 10:41:13.131054586 +0200 +++ /var/tmp/diff_new_pack.t7hmcS/_new 2019-05-21 10:41:13.135054583 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-requirements-parser # -# Copyright (c) 2015 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 @@ -12,47 +12,48 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # +%{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-requirements-parser -Version: 0.1.0 +Version: 0.2.0 Release: 0 Summary: Parses Pip requirement files License: BSD-2-Clause Group: Development/Languages/Python Url: https://github.com/davidfischer/requirements-parser -Source: https://pypi.python.org/packages/source/r/requirements-parser/requirements-parser-%{version}.tar.gz -BuildRequires: python-devel -BuildRequires: python-setuptools -# Test requirements: -BuildRequires: python-nose -BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if 0%{?suse_version} && 0%{?suse_version} <= 1110 -%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} -%else +Source: https://files.pythonhosted.org/packages/source/r/requirements-parser/requirements-parser-%{version}.tar.gz +BuildRequires: %{python_module setuptools} +BuildRequires: python-rpm-macros +# SECTION test requirements +BuildRequires: %{python_module nose} +# /SECTION +BuildRequires: fdupes BuildArch: noarch -%endif + +%python_subpackages %description -This is a small Python module for parsing Pip requirement files. +Parses Pip requirement files %prep %setup -q -n requirements-parser-%{version} %build -python setup.py build +%python_build %install -python setup.py install --prefix=%{_prefix} --root=%{buildroot} +%python_install +%python_expand %fdupes %{buildroot}%{$python_sitelib} %check -python setup.py test +%python_exec setup.py test -%files -%defattr(-,root,root,-) -%doc LICENSE.rst README.rst +%files %{python_files} +%doc AUTHORS.rst README.rst +%license LICENSE.rst %{python_sitelib}/* %changelog ++++++ requirements-parser-0.1.0.tar.gz -> requirements-parser-0.2.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/AUTHORS.rst new/requirements-parser-0.2.0/AUTHORS.rst --- old/requirements-parser-0.1.0/AUTHORS.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/requirements-parser-0.2.0/AUTHORS.rst 2017-09-09 05:16:04.000000000 +0200 @@ -0,0 +1,11 @@ +AUTHORS +======= + +- David Fischer (@davidfischer) +- Trey Hunner (@treyhunner) +- Dima Veselov (@dveselov) +- Sascha Peilicke (@saschpe) +- Jayson Reis (@jaysonsantos) +- Max Shenfield (@mshenfield) +- Nicolas Delaby (@ticosax) +- Stéphane Bidoul (@sbidoul) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/PKG-INFO new/requirements-parser-0.2.0/PKG-INFO --- old/requirements-parser-0.1.0/PKG-INFO 2015-05-03 03:36:14.000000000 +0200 +++ new/requirements-parser-0.2.0/PKG-INFO 2018-01-12 05:45:19.000000000 +0100 @@ -1,23 +1,30 @@ Metadata-Version: 1.1 Name: requirements-parser -Version: 0.1.0 +Version: 0.2.0 Summary: Parses Pip requirement files Home-page: https://github.com/davidfischer/requirements-parser Author: David Fischer Author-email: djfis...@gmail.com License: BSD +Description-Content-Type: UNKNOWN Description: Requirements Parser =================== - .. image:: https://secure.travis-ci.org/davidfischer/requirements-parser.png?branch=master + .. image:: https://travis-ci.org/davidfischer/requirements-parser.svg?branch=master :target: https://travis-ci.org/davidfischer/requirements-parser - .. image:: https://coveralls.io/repos/davidfischer/requirements-parser/badge.png - :target: https://coveralls.io/r/davidfischer/requirements-parser + .. image:: https://coveralls.io/repos/github/davidfischer/requirements-parser/badge.svg?branch=master + :target: https://coveralls.io/github/davidfischer/requirements-parser?branch=master + .. image:: http://readthedocs.org/projects/requirements-parser/badge/?version=latest + :target: http://requirements-parser.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status This is a small Python module for parsing Pip_ requirement files. + The goal is to parse everything in the `Pip requirement file format`_ spec. + .. _Pip: http://www.pip-installer.org/ + .. _Pip requirement file format: https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format Installation @@ -33,18 +40,30 @@ Requirements parser can parse a file-like object or a text string. - :: + .. code-block:: python >>> import requirements - >>> reqfile = """ - ... Django>=1.5,<1.6 - ... DocParser[PDF]==1.0.0 - ... """ - >>> for req in requirements.parse(reqfile): - ... print(req.name, req.specs, req.extras) - ... - ('Django', [('>=', '1.5'), ('<', '1.6')], []) - ('DocParser', [('==', '1.0.0')], ['pdf']) + >>> with open('requirements.txt', 'r') as fd: + ... for req in requirements.parse(fd): + ... print(req.name, req.specs) + Django [('>=', '1.11'), ('<', '1.12')] + six [('==', '1.10.0')] + + It can handle most if not all of the options in requirement files that do + not involve traversing the local filesystem. These include: + + * editables (`-e git+https://github.com/toastdriven/pyelasticsearch.git`) + * version control URIs + * egg hashes and subdirectories (`#egg=django-haystack&subdirectory=setup`) + * extras (`DocParser[PDF]`) + * URLs + + + Documentation + ============= + + For more details and examples, the documentation is available at: + http://requirements-parser.readthedocs.io. Platform: OS Independent Classifier: Development Status :: 4 - Beta @@ -52,9 +71,10 @@ Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: Topic :: Software Development :: Libraries :: Python Modules diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/README.rst new/requirements-parser-0.2.0/README.rst --- old/requirements-parser-0.1.0/README.rst 2013-08-16 17:56:26.000000000 +0200 +++ new/requirements-parser-0.2.0/README.rst 2017-09-09 06:03:04.000000000 +0200 @@ -2,14 +2,20 @@ =================== -.. image:: https://secure.travis-ci.org/davidfischer/requirements-parser.png?branch=master +.. image:: https://travis-ci.org/davidfischer/requirements-parser.svg?branch=master :target: https://travis-ci.org/davidfischer/requirements-parser -.. image:: https://coveralls.io/repos/davidfischer/requirements-parser/badge.png - :target: https://coveralls.io/r/davidfischer/requirements-parser +.. image:: https://coveralls.io/repos/github/davidfischer/requirements-parser/badge.svg?branch=master + :target: https://coveralls.io/github/davidfischer/requirements-parser?branch=master +.. image:: http://readthedocs.org/projects/requirements-parser/badge/?version=latest + :target: http://requirements-parser.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status This is a small Python module for parsing Pip_ requirement files. +The goal is to parse everything in the `Pip requirement file format`_ spec. + .. _Pip: http://www.pip-installer.org/ +.. _Pip requirement file format: https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format Installation @@ -25,15 +31,27 @@ Requirements parser can parse a file-like object or a text string. -:: +.. code-block:: python >>> import requirements - >>> reqfile = """ - ... Django>=1.5,<1.6 - ... DocParser[PDF]==1.0.0 - ... """ - >>> for req in requirements.parse(reqfile): - ... print(req.name, req.specs, req.extras) - ... - ('Django', [('>=', '1.5'), ('<', '1.6')], []) - ('DocParser', [('==', '1.0.0')], ['pdf']) + >>> with open('requirements.txt', 'r') as fd: + ... for req in requirements.parse(fd): + ... print(req.name, req.specs) + Django [('>=', '1.11'), ('<', '1.12')] + six [('==', '1.10.0')] + +It can handle most if not all of the options in requirement files that do +not involve traversing the local filesystem. These include: + +* editables (`-e git+https://github.com/toastdriven/pyelasticsearch.git`) +* version control URIs +* egg hashes and subdirectories (`#egg=django-haystack&subdirectory=setup`) +* extras (`DocParser[PDF]`) +* URLs + + +Documentation +============= + +For more details and examples, the documentation is available at: +http://requirements-parser.readthedocs.io. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/requirements/__init__.py new/requirements-parser-0.2.0/requirements/__init__.py --- old/requirements-parser-0.1.0/requirements/__init__.py 2015-05-03 02:13:02.000000000 +0200 +++ new/requirements-parser-0.2.0/requirements/__init__.py 2018-01-12 05:35:20.000000000 +0100 @@ -1,7 +1,7 @@ from .parser import parse # noqa _MAJOR = 0 -_MINOR = 1 +_MINOR = 2 _PATCH = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/requirements/fragment.py new/requirements-parser-0.2.0/requirements/fragment.py --- old/requirements-parser-0.1.0/requirements/fragment.py 1970-01-01 01:00:00.000000000 +0100 +++ new/requirements-parser-0.2.0/requirements/fragment.py 2017-09-09 04:58:41.000000000 +0200 @@ -0,0 +1,44 @@ +import re + +# Copied from pip +# https://github.com/pypa/pip/blob/281eb61b09d87765d7c2b92f6982b3fe76ccb0af/pip/index.py#L947 +HASH_ALGORITHMS = set(['sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5']) + +extras_require_search = re.compile( + r'(?P<name>.+)\[(?P<extras>[^\]]+)\]').search + + +def parse_fragment(fragment_string): + """Takes a fragment string nd returns a dict of the components""" + fragment_string = fragment_string.lstrip('#') + + try: + return dict( + key_value_string.split('=') + for key_value_string in fragment_string.split('&') + ) + except ValueError: + raise ValueError( + 'Invalid fragment string {fragment_string}'.format( + fragment_string=fragment_string + ) + ) + + +def get_hash_info(d): + """Returns the first matching hashlib name and value from a dict""" + for key in d.keys(): + if key.lower() in HASH_ALGORITHMS: + return key, d[key] + + return None, None + + +def parse_extras_require(egg): + if egg is not None: + match = extras_require_search(egg) + if match is not None: + name = match.group('name') + extras = match.group('extras') + return name, [extra.strip() for extra in extras.split(',')] + return egg, [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/requirements/requirement.py new/requirements-parser-0.2.0/requirements/requirement.py --- old/requirements-parser-0.1.0/requirements/requirement.py 2013-09-24 03:21:21.000000000 +0200 +++ new/requirements-parser-0.2.0/requirements/requirement.py 2018-01-12 05:25:47.000000000 +0100 @@ -2,12 +2,13 @@ import re from pkg_resources import Requirement as Req +from .fragment import get_hash_info, parse_fragment, parse_extras_require from .vcs import VCS, VCS_SCHEMES URI_REGEX = re.compile( r'^(?P<scheme>https?|file|ftps?)://(?P<path>[^#]+)' - r'(#egg=(?P<name>[^&]+))?$' + r'(#(?P<fragment>\S+))?' ) VCS_REGEX = re.compile( @@ -16,14 +17,14 @@ r'((?P<login>[^/@]+)@)?' r'(?P<path>[^#@]+)' r'(@(?P<revision>[^#]+))?' - r'(#egg=(?P<name>[^&]+))?$' + r'(#(?P<fragment>\S+))?' ) # This matches just about everyting LOCAL_REGEX = re.compile( r'^((?P<scheme>file)://)?' - r'(?P<path>[^#]+)' - r'(#egg=(?P<name>[^&]+))?$' + r'(?P<path>[^#]+)' + + r'(#(?P<fragment>\S+))?' ) @@ -48,7 +49,10 @@ * ``revision`` - a version control system specifier * ``name`` - the name of the requirement * ``uri`` - the URI if this requirement was specified by URI + * ``subdirectory`` - the subdirectory fragment of the URI * ``path`` - the local path to the requirement + * ``hash_name`` - the type of hashing algorithm indicated in the line + * ``hash`` - the hash value indicated by the requirement line * ``extras`` - a list of extras for this requirement (eg. "mymodule[extra1, extra2]") * ``specs`` - a list of specs for this requirement @@ -63,9 +67,12 @@ self.specifier = False self.vcs = None self.name = None + self.subdirectory = None self.uri = None self.path = None self.revision = None + self.hash_name = None + self.hash = None self.extras = [] self.specs = [] @@ -98,9 +105,17 @@ if vcs_match is not None: groups = vcs_match.groupdict() - req.uri = '{scheme}://{path}'.format(**groups) + if groups.get('login'): + req.uri = '{scheme}://{login}@{path}'.format(**groups) + else: + req.uri = '{scheme}://{path}'.format(**groups) req.revision = groups['revision'] - req.name = groups['name'] + if groups['fragment']: + fragment = parse_fragment(groups['fragment']) + egg = fragment.get('egg') + req.name, req.extras = parse_extras_require(egg) + req.hash_name, req.hash = get_hash_info(fragment) + req.subdirectory = fragment.get('subdirectory') for vcs in VCS: if req.uri.startswith(vcs): req.vcs = vcs @@ -108,7 +123,12 @@ assert local_match is not None, 'This should match everything' groups = local_match.groupdict() req.local_file = True - req.name = groups['name'] + if groups['fragment']: + fragment = parse_fragment(groups['fragment']) + egg = fragment.get('egg') + req.name, req.extras = parse_extras_require(egg) + req.hash_name, req.hash = get_hash_info(fragment) + req.subdirectory = fragment.get('subdirectory') req.path = groups['path'] return req @@ -133,16 +153,29 @@ if vcs_match is not None: groups = vcs_match.groupdict() - req.uri = '{scheme}://{path}'.format(**groups) + if groups.get('login'): + req.uri = '{scheme}://{login}@{path}'.format(**groups) + else: + req.uri = '{scheme}://{path}'.format(**groups) req.revision = groups['revision'] - req.name = groups['name'] + if groups['fragment']: + fragment = parse_fragment(groups['fragment']) + egg = fragment.get('egg') + req.name, req.extras = parse_extras_require(egg) + req.hash_name, req.hash = get_hash_info(fragment) + req.subdirectory = fragment.get('subdirectory') for vcs in VCS: if req.uri.startswith(vcs): req.vcs = vcs elif uri_match is not None: groups = uri_match.groupdict() req.uri = '{scheme}://{path}'.format(**groups) - req.name = groups['name'] + if groups['fragment']: + fragment = parse_fragment(groups['fragment']) + egg = fragment.get('egg') + req.name, req.extras = parse_extras_require(egg) + req.hash_name, req.hash = get_hash_info(fragment) + req.subdirectory = fragment.get('subdirectory') if groups['scheme'] == 'file': req.local_file = True elif '#egg=' in line: @@ -150,7 +183,13 @@ assert local_match is not None, 'This should match everything' groups = local_match.groupdict() req.local_file = True - req.name = groups['name'] + if groups['fragment']: + fragment = parse_fragment(groups['fragment']) + egg = fragment.get('egg') + name, extras = parse_extras_require(egg) + req.name = fragment.get('egg') + req.hash_name, req.hash = get_hash_info(fragment) + req.subdirectory = fragment.get('subdirectory') req.path = groups['path'] else: # This is a requirement specifier. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/requirements_parser.egg-info/PKG-INFO new/requirements-parser-0.2.0/requirements_parser.egg-info/PKG-INFO --- old/requirements-parser-0.1.0/requirements_parser.egg-info/PKG-INFO 2015-05-03 03:36:14.000000000 +0200 +++ new/requirements-parser-0.2.0/requirements_parser.egg-info/PKG-INFO 2018-01-12 05:45:19.000000000 +0100 @@ -1,23 +1,30 @@ Metadata-Version: 1.1 Name: requirements-parser -Version: 0.1.0 +Version: 0.2.0 Summary: Parses Pip requirement files Home-page: https://github.com/davidfischer/requirements-parser Author: David Fischer Author-email: djfis...@gmail.com License: BSD +Description-Content-Type: UNKNOWN Description: Requirements Parser =================== - .. image:: https://secure.travis-ci.org/davidfischer/requirements-parser.png?branch=master + .. image:: https://travis-ci.org/davidfischer/requirements-parser.svg?branch=master :target: https://travis-ci.org/davidfischer/requirements-parser - .. image:: https://coveralls.io/repos/davidfischer/requirements-parser/badge.png - :target: https://coveralls.io/r/davidfischer/requirements-parser + .. image:: https://coveralls.io/repos/github/davidfischer/requirements-parser/badge.svg?branch=master + :target: https://coveralls.io/github/davidfischer/requirements-parser?branch=master + .. image:: http://readthedocs.org/projects/requirements-parser/badge/?version=latest + :target: http://requirements-parser.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status This is a small Python module for parsing Pip_ requirement files. + The goal is to parse everything in the `Pip requirement file format`_ spec. + .. _Pip: http://www.pip-installer.org/ + .. _Pip requirement file format: https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format Installation @@ -33,18 +40,30 @@ Requirements parser can parse a file-like object or a text string. - :: + .. code-block:: python >>> import requirements - >>> reqfile = """ - ... Django>=1.5,<1.6 - ... DocParser[PDF]==1.0.0 - ... """ - >>> for req in requirements.parse(reqfile): - ... print(req.name, req.specs, req.extras) - ... - ('Django', [('>=', '1.5'), ('<', '1.6')], []) - ('DocParser', [('==', '1.0.0')], ['pdf']) + >>> with open('requirements.txt', 'r') as fd: + ... for req in requirements.parse(fd): + ... print(req.name, req.specs) + Django [('>=', '1.11'), ('<', '1.12')] + six [('==', '1.10.0')] + + It can handle most if not all of the options in requirement files that do + not involve traversing the local filesystem. These include: + + * editables (`-e git+https://github.com/toastdriven/pyelasticsearch.git`) + * version control URIs + * egg hashes and subdirectories (`#egg=django-haystack&subdirectory=setup`) + * extras (`DocParser[PDF]`) + * URLs + + + Documentation + ============= + + For more details and examples, the documentation is available at: + http://requirements-parser.readthedocs.io. Platform: OS Independent Classifier: Development Status :: 4 - Beta @@ -52,9 +71,10 @@ Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: Topic :: Software Development :: Libraries :: Python Modules diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/requirements_parser.egg-info/SOURCES.txt new/requirements-parser-0.2.0/requirements_parser.egg-info/SOURCES.txt --- old/requirements-parser-0.1.0/requirements_parser.egg-info/SOURCES.txt 2015-05-03 03:36:14.000000000 +0200 +++ new/requirements-parser-0.2.0/requirements_parser.egg-info/SOURCES.txt 2018-01-12 05:45:19.000000000 +0100 @@ -1,8 +1,10 @@ +AUTHORS.rst LICENSE.rst MANIFEST.in README.rst setup.py requirements/__init__.py +requirements/fragment.py requirements/parser.py requirements/requirement.py requirements/vcs.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/requirements-parser-0.1.0/setup.cfg new/requirements-parser-0.2.0/setup.cfg --- old/requirements-parser-0.1.0/setup.cfg 2015-05-03 03:36:14.000000000 +0200 +++ new/requirements-parser-0.2.0/setup.cfg 2018-01-12 05:45:19.000000000 +0100 @@ -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/requirements-parser-0.1.0/setup.py new/requirements-parser-0.2.0/setup.py --- old/requirements-parser-0.1.0/setup.py 2015-05-03 02:13:07.000000000 +0200 +++ new/requirements-parser-0.2.0/setup.py 2018-01-12 05:35:29.000000000 +0100 @@ -16,7 +16,7 @@ setup( name='requirements-parser', - version='0.1.0', + version='0.2.0', description='Parses Pip requirement files', long_description=long_description, author='David Fischer', @@ -31,11 +31,12 @@ 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'Topic :: Software Development :: Libraries :: Python Modules', ], tests_require=['nose'],