Hello community, here is the log from the commit of package python-configparser for openSUSE:Factory checked in at 2019-02-08 13:48:27 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-configparser (Old) and /work/SRC/openSUSE:Factory/.python-configparser.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-configparser" Fri Feb 8 13:48:27 2019 rev:7 rq:672130 version:3.7.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-configparser/python-configparser.changes 2018-12-06 12:14:17.525714823 +0100 +++ /work/SRC/openSUSE:Factory/.python-configparser.new.28833/python-configparser.changes 2019-02-08 13:48:28.390777882 +0100 @@ -1,0 +2,24 @@ +Wed Feb 6 11:20:19 UTC 2019 - Antonio Larrosa <alarr...@suse.com> + +- Update to 3.7.1 + * Fixed issue on Python 2.x when future is present (gh#jacaro/configparser#30) +- Update to 3.7.0 + * Merge functionality from Python 3.7.2. Now ConfigParser accepts bytes paths + as well as any PathLike object, including those found in the pathlib2 + backport <https://pypi.org/project/pathlib2/>. +- Update to 3.5.3 + * Reverted the limit on DeprecationWarning, as it + had unintended consequences (gh#jacaro/configparser#27) +- Update to 3.5.2 + * Use environment markers to indicate the 'ordereddict' dependency for + Python 2.6 (gh#jacaro/configparser#23) + * Limit DeprecationWarning when a filename is indicated as a bytestring on + Python 2. Now the warning is only emitted when py3kwarning is indicated + (gh#jacaro/configparser#24) +- Update to 3.5.1 + * jaraco adopts the package. + * Moved hosting to GitHub. + * Updated backports namespace package to conform with other packages sharing + the namespace (gh#jacaro/configparser#21) + +------------------------------------------------------------------- Old: ---- configparser-3.5.0.tar.gz New: ---- configparser-3.7.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-configparser.spec ++++++ --- /var/tmp/diff_new_pack.V7DRdc/_old 2019-02-08 13:48:28.922777715 +0100 +++ /var/tmp/diff_new_pack.V7DRdc/_new 2019-02-08 13:48:28.930777713 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-configparser # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2016, Martin Hauke <mar...@gmx.de> # # All modifications and additions to the file contributed by third parties @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-configparser -Version: 3.5.0 +Version: 3.7.1 Release: 0 Summary: Backport of the enhanced config parser introduced in Python 3.x License: MIT @@ -48,10 +48,14 @@ %setup -q -n configparser-%{version} %build +export LANG=en_US.UTF-8 %python_build %install +export LANG=en_US.UTF-8 %python_install +%python_expand rm -f %{buildroot}%{$python_sitelib}/backports/__init__.py* +%python_expand rm -f %{buildroot}%{$python_sitelib}/backports/__pycache__/__init__* %python_expand %fdupes %{buildroot}%{$python_sitelib}/backports/configparser/ %files %{python_files} @@ -60,6 +64,5 @@ %python2_only %{python_sitelib}/configparser.py* %{python_sitelib}/backports/configparser/ %{python_sitelib}/configparser-%{version}-py*.egg-info -%{python_sitelib}/configparser-%{version}-py*-nspkg.pth %changelog ++++++ configparser-3.5.0.tar.gz -> configparser-3.7.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/MANIFEST.in new/configparser-3.7.1/MANIFEST.in --- old/configparser-3.5.0/MANIFEST.in 2016-05-21 08:55:42.000000000 +0200 +++ new/configparser-3.7.1/MANIFEST.in 2019-01-25 12:09:29.000000000 +0100 @@ -1,3 +1,4 @@ include configparser.rst include README.rst include setup.py +include pyproject.toml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/PKG-INFO new/configparser-3.7.1/PKG-INFO --- old/configparser-3.5.0/PKG-INFO 2016-05-21 10:15:06.000000000 +0200 +++ new/configparser-3.7.1/PKG-INFO 2019-01-25 17:35:46.000000000 +0100 @@ -1,11 +1,13 @@ -Metadata-Version: 1.1 +Metadata-Version: 1.2 Name: configparser -Version: 3.5.0 -Summary: This library brings the updated configparser from Python 3.5 to Python 2.6-3.5. -Home-page: http://docs.python.org/3/library/configparser.html +Version: 3.7.1 +Summary: Updated configparser from Python 3.7 for Python 2.6+. +Home-page: https://github.com/jaraco/configparser/ Author: Łukasz Langa Author-email: luk...@langa.pl -License: MIT +Maintainer: Jason R. Coombs +Maintainer-email: jar...@jaraco.com +License: UNKNOWN Description: ============ configparser ============ @@ -140,16 +142,57 @@ Maintenance ----------- - This backport is maintained on BitBucket by Łukasz Langa, the current vanilla - ``configparser`` maintainer for CPython: + This backport was originally authored by Łukasz Langa, the current vanilla + ``configparser`` maintainer for CPython and is currently maintained by + Jason R. Coombs: - * `configparser Mercurial repository <https://bitbucket.org/ambv/configparser>`_ + * `configparser repository <https://github.com/jaraco/configparser>`_ - * `configparser issue tracker <https://bitbucket.org/ambv/configparser/issues>`_ + * `configparser issue tracker <https://github.com/jaraco/configparser/issues>`_ Change Log ---------- + 3.7.1 + ~~~~~ + + * Issue #30: Fixed issue on Python 2.x when future is present. + + 3.7.0 + ~~~~~ + + * Merge functionality from Python 3.7.2. Now ConfigParser accepts bytes + paths as well as any + `PathLike <https://docs.python.org/3/library/os.html#os.PathLike>`_ + object, including those found in the `pathlib2 backport + <https://pypi.org/project/pathlib2/>`. + + 3.5.3 + ~~~~~ + + * Issue #27: Reverted the limit on DeprecationWarning, as it had unintended + consequences. + + 3.5.2 + ~~~~~ + + * Issue #23: Use environment markers to indicate the 'ordereddict' dependency + for Python 2.6. + + * Issue #24: Limit DeprecationWarning when a filename is indicated as a + bytestring on Python 2. Now the warning is only emitted when py3kwarning + is indicated. + + 3.5.1 + ~~~~~ + + * jaraco adopts the package. + + * Moved hosting to GitHub. + + * Issue #21: Updated ``backports`` namespace package to conform with other + packages sharing the namespace. + 3.5.0 ~~~~~ @@ -256,7 +299,7 @@ CPython repository. The synchronization is currently done by manually copying the required files and stating from which CPython changeset they come from. - * the ``default`` branch holds a version of the ``3.x`` code with some tweaks + * the ``master`` branch holds a version of the ``3.x`` code with some tweaks that make it independent from libraries and constructions unavailable on 2.x. Code on this branch still *must* work on the corresponding Python 3.x but will also work on Python 2.6 and 2.7 (including PyPy). You can check this @@ -264,16 +307,17 @@ The process works like this: - 1. I update the ``3.x`` branch with new versions of files. Note that the - actual ``configparser.py`` file is now just a proxy for sources held in - ``backports/configparser/__init__.py``. + 1. In the ``3.x`` branch, run ``pip-run -- sync-upstream.py``, which + downloads the latest stable release of Python and copies the relevant + files from there into their new locations here and then commits those + changes with a nice reference to the relevant upstream commit hash. 2. I check for new names in ``__all__`` and update imports in ``configparser.py`` accordingly. I run the tests on Python 3. Commit. - 3. I merge the new commit to ``default``. I run ``tox``. Commit. + 3. I merge the new commit to ``master``. I run ``tox``. Commit. - 4. If there are necessary changes, I do them now (on ``default``). Note that + 4. If there are necessary changes, I do them now (on ``master``). Note that the changes should be written in the syntax subset supported by Python 2.6. @@ -324,5 +368,8 @@ 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: Topic :: Software Development :: Libraries Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/README.rst new/configparser-3.7.1/README.rst --- old/configparser-3.5.0/README.rst 2016-05-21 10:13:37.000000000 +0200 +++ new/configparser-3.7.1/README.rst 2019-01-25 17:24:35.000000000 +0100 @@ -132,16 +132,57 @@ Maintenance ----------- -This backport is maintained on BitBucket by Łukasz Langa, the current vanilla -``configparser`` maintainer for CPython: +This backport was originally authored by Łukasz Langa, the current vanilla +``configparser`` maintainer for CPython and is currently maintained by +Jason R. Coombs: -* `configparser Mercurial repository <https://bitbucket.org/ambv/configparser>`_ +* `configparser repository <https://github.com/jaraco/configparser>`_ -* `configparser issue tracker <https://bitbucket.org/ambv/configparser/issues>`_ +* `configparser issue tracker <https://github.com/jaraco/configparser/issues>`_ Change Log ---------- +3.7.1 +~~~~~ + +* Issue #30: Fixed issue on Python 2.x when future is present. + +3.7.0 +~~~~~ + +* Merge functionality from Python 3.7.2. Now ConfigParser accepts bytes + paths as well as any + `PathLike <https://docs.python.org/3/library/os.html#os.PathLike>`_ + object, including those found in the `pathlib2 backport + <https://pypi.org/project/pathlib2/>`. + +3.5.3 +~~~~~ + +* Issue #27: Reverted the limit on DeprecationWarning, as it had unintended + consequences. + +3.5.2 +~~~~~ + +* Issue #23: Use environment markers to indicate the 'ordereddict' dependency + for Python 2.6. + +* Issue #24: Limit DeprecationWarning when a filename is indicated as a + bytestring on Python 2. Now the warning is only emitted when py3kwarning + is indicated. + +3.5.1 +~~~~~ + +* jaraco adopts the package. + +* Moved hosting to GitHub. + +* Issue #21: Updated ``backports`` namespace package to conform with other + packages sharing the namespace. + 3.5.0 ~~~~~ @@ -248,7 +289,7 @@ CPython repository. The synchronization is currently done by manually copying the required files and stating from which CPython changeset they come from. -* the ``default`` branch holds a version of the ``3.x`` code with some tweaks +* the ``master`` branch holds a version of the ``3.x`` code with some tweaks that make it independent from libraries and constructions unavailable on 2.x. Code on this branch still *must* work on the corresponding Python 3.x but will also work on Python 2.6 and 2.7 (including PyPy). You can check this @@ -256,16 +297,17 @@ The process works like this: -1. I update the ``3.x`` branch with new versions of files. Note that the - actual ``configparser.py`` file is now just a proxy for sources held in - ``backports/configparser/__init__.py``. +1. In the ``3.x`` branch, run ``pip-run -- sync-upstream.py``, which + downloads the latest stable release of Python and copies the relevant + files from there into their new locations here and then commits those + changes with a nice reference to the relevant upstream commit hash. 2. I check for new names in ``__all__`` and update imports in ``configparser.py`` accordingly. I run the tests on Python 3. Commit. -3. I merge the new commit to ``default``. I run ``tox``. Commit. +3. I merge the new commit to ``master``. I run ``tox``. Commit. -4. If there are necessary changes, I do them now (on ``default``). Note that +4. If there are necessary changes, I do them now (on ``master``). Note that the changes should be written in the syntax subset supported by Python 2.6. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/configparser.rst new/configparser-3.7.1/configparser.rst --- old/configparser-3.5.0/configparser.rst 2014-09-05 02:12:46.000000000 +0200 +++ new/configparser-3.7.1/configparser.rst 2019-01-25 15:17:29.000000000 +0100 @@ -19,6 +19,8 @@ single: ini file single: Windows ini file +-------------- + This module provides the :class:`ConfigParser` class which implements a basic configuration language which provides a structure similar to what's found in Microsoft Windows INI files. You can use this to write Python programs which @@ -32,14 +34,19 @@ .. seealso:: Module :mod:`shlex` - Support for a creating Unix shell-like mini-languages which can be used - as an alternate format for application configuration files. + Support for creating Unix shell-like mini-languages which can be used as + an alternate format for application configuration files. Module :mod:`json` The json module implements a subset of JavaScript syntax which can also be used for this purpose. +.. testsetup:: + + import configparser + + Quick Start ----------- @@ -64,7 +71,7 @@ <#supported-ini-file-structure>`_. Essentially, the file consists of sections, each of which contains keys with values. :mod:`configparser` classes can read and write such files. Let's start by -creating the above configuration file programatically. +creating the above configuration file programmatically. .. doctest:: @@ -93,7 +100,6 @@ .. doctest:: - >>> import configparser >>> config = configparser.ConfigParser() >>> config.sections() [] @@ -114,8 +120,8 @@ 'no' >>> topsecret['Port'] '50022' - >>> for key in config['bitbucket.org']: print(key) - ... + >>> for key in config['bitbucket.org']: # doctest: +SKIP + ... print(key) user compressionlevel serveraliveinterval @@ -144,12 +150,13 @@ >>> float(topsecret['CompressionLevel']) 9.0 -Extracting Boolean values is not that simple, though. Passing the value -to ``bool()`` would do no good since ``bool('False')`` is still -``True``. This is why config parsers also provide :meth:`getboolean`. -This method is case-insensitive and recognizes Boolean values from -``'yes'``/``'no'``, ``'on'``/``'off'`` and ``'1'``/``'0'`` [1]_. -For example: +Since this task is so common, config parsers provide a range of handy getter +methods to handle integers, floats and booleans. The last one is the most +interesting because simply passing the value to ``bool()`` would do no good +since ``bool('False')`` is still ``True``. This is why config parsers also +provide :meth:`~ConfigParser.getboolean`. This method is case-insensitive and +recognizes Boolean values from ``'yes'``/``'no'``, ``'on'``/``'off'``, +``'true'``/``'false'`` and ``'1'``/``'0'`` [1]_. For example: .. doctest:: @@ -160,11 +167,10 @@ >>> config.getboolean('bitbucket.org', 'Compression') True -Apart from :meth:`getboolean`, config parsers also provide equivalent -:meth:`getint` and :meth:`getfloat` methods, but these are far less -useful since conversion using :func:`int` and :func:`float` is -sufficient for these types. - +Apart from :meth:`~ConfigParser.getboolean`, config parsers also +provide equivalent :meth:`~ConfigParser.getint` and +:meth:`~ConfigParser.getfloat` methods. You can register your own +converters and customize the provided ones. [1]_ Fallback Values --------------- @@ -204,8 +210,9 @@ ... fallback='No such things as monsters') 'No such things as monsters' -The same ``fallback`` argument can be used with the :meth:`getint`, -:meth:`getfloat` and :meth:`getboolean` methods, for example: +The same ``fallback`` argument can be used with the +:meth:`~ConfigParser.getint`, :meth:`~ConfigParser.getfloat` and +:meth:`~ConfigParser.getboolean` methods, for example: .. doctest:: @@ -288,6 +295,8 @@ interpolation. This means values can be preprocessed before returning them from ``get()`` calls. +.. index:: single: % (percent); interpolation in configuration files + .. class:: BasicInterpolation() The default implementation used by :class:`ConfigParser`. It enables @@ -316,14 +325,16 @@ ``%(my_dir)s/Pictures`` as the value of ``my_pictures`` and ``%(home_dir)s/lumberjack`` as the value of ``my_dir``. +.. index:: single: $ (dollar); interpolation in configuration files + .. class:: ExtendedInterpolation() An alternative handler for interpolation which implements a more advanced - syntax, used for instance in ``zc.buildout``. Extended interpolation is + syntax, used for instance in ``zc.buildout``. Extended interpolation is using ``${section:option}`` to denote a value from a foreign section. - Interpolation can span multiple levels. For convenience, if the ``section:`` - part is omitted, interpolation defaults to the current section (and possibly - the default values from the special section). + Interpolation can span multiple levels. For convenience, if the + ``section:`` part is omitted, interpolation defaults to the current section + (and possibly the default values from the special section). For example, the configuration specified above with basic interpolation, would look like this with extended interpolation: @@ -390,24 +401,24 @@ because default values cannot be deleted from the section (because technically they are not there). If they are overridden in the section, deleting causes the default value to be visible again. Trying to delete a default value - causes a ``KeyError``. + causes a :exc:`KeyError`. * ``DEFAULTSECT`` cannot be removed from the parser: - * trying to delete it raises ``ValueError``, + * trying to delete it raises :exc:`ValueError`, * ``parser.clear()`` leaves it intact, * ``parser.popitem()`` never returns it. * ``parser.get(section, option, **kwargs)`` - the second argument is **not** - a fallback value. Note however that the section-level ``get()`` methods are + a fallback value. Note however that the section-level ``get()`` methods are compatible both with the mapping protocol and the classic configparser API. * ``parser.items()`` is compatible with the mapping protocol (returns a list of *section_name*, *section_proxy* pairs including the DEFAULTSECT). However, this method can also be invoked with arguments: ``parser.items(section, raw, - vars)``. The latter call returns a list of *option*, *value* pairs for + vars)``. The latter call returns a list of *option*, *value* pairs for a specified ``section``, with all interpolations expanded (unless ``raw=True`` is provided). @@ -466,9 +477,9 @@ ... 'bar': 'y', ... 'baz': 'z'} ... }) - >>> parser.sections() + >>> parser.sections() # doctest: +SKIP ['section3', 'section2', 'section1'] - >>> [option for option in parser['section3']] + >>> [option for option in parser['section3']] # doctest: +SKIP ['baz', 'foo', 'bar'] In these operations you need to use an ordered dictionary as well: @@ -495,11 +506,11 @@ ... ), ... )) ... ) - >>> parser.sections() + >>> parser.sections() # doctest: +SKIP ['s1', 's2'] - >>> [option for option in parser['s1']] + >>> [option for option in parser['s1']] # doctest: +SKIP ['1', '3', '5'] - >>> [option for option in parser['s2'].values()] + >>> [option for option in parser['s2'].values()] # doctest: +SKIP ['b', 'd', 'f'] * *allow_no_value*, default value: ``False`` @@ -541,9 +552,9 @@ * *delimiters*, default value: ``('=', ':')`` - Delimiters are substrings that delimit keys from values within a section. The - first occurrence of a delimiting substring on a line is considered a delimiter. - This means values (but not keys) can contain the delimiters. + Delimiters are substrings that delimit keys from values within a section. + The first occurrence of a delimiting substring on a line is considered + a delimiter. This means values (but not keys) can contain the delimiters. See also the *space_around_delimiters* argument to :meth:`ConfigParser.write`. @@ -555,7 +566,7 @@ Comment prefixes are strings that indicate the start of a valid comment within a config file. *comment_prefixes* are used only on otherwise empty lines (optionally indented) whereas *inline_comment_prefixes* can be used after - every valid value (e.g. section names, options and empty lines as well). By + every valid value (e.g. section names, options and empty lines as well). By default inline comments are disabled and ``'#'`` and ``';'`` are used as prefixes for whole line comments. @@ -565,10 +576,10 @@ Please note that config parsers don't support escaping of comment prefixes so using *inline_comment_prefixes* may prevent users from specifying option - values with characters used as comment prefixes. When in doubt, avoid setting - *inline_comment_prefixes*. In any circumstances, the only way of storing - comment prefix characters at the beginning of a line in multiline values is to - interpolate the prefix, for example:: + values with characters used as comment prefixes. When in doubt, avoid + setting *inline_comment_prefixes*. In any circumstances, the only way of + storing comment prefix characters at the beginning of a line in multiline + values is to interpolate the prefix, for example:: >>> from configparser import ConfigParser, ExtendedInterpolation >>> parser = ConfigParser(interpolation=ExtendedInterpolation()) @@ -594,11 +605,11 @@ ... line #3 ... """) >>> print(parser['hashes']['shebang']) - + <BLANKLINE> #!/usr/bin/env python # -*- coding: utf-8 -*- >>> print(parser['hashes']['extensions']) - + <BLANKLINE> enabled_extension another_extension yet_another_extension @@ -613,7 +624,7 @@ When set to ``True``, the parser will not allow for any section or option duplicates while reading from a single source (using :meth:`read_file`, - :meth:`read_string` or :meth:`read_dict`). It is recommended to use strict + :meth:`read_string` or :meth:`read_dict`). It is recommended to use strict parsers in new applications. .. versionchanged:: 3.2 @@ -648,12 +659,12 @@ The convention of allowing a special section of default values for other sections or interpolation purposes is a powerful concept of this library, - letting users create complex declarative configurations. This section is + letting users create complex declarative configurations. This section is normally called ``"DEFAULT"`` but this can be customized to point to any - other valid section name. Some typical values include: ``"general"`` or - ``"common"``. The name provided is used for recognizing default sections when - reading from any source and is used when writing configuration back to - a file. Its current value can be retrieved using the + other valid section name. Some typical values include: ``"general"`` or + ``"common"``. The name provided is used for recognizing default sections + when reading from any source and is used when writing configuration back to + a file. Its current value can be retrieved using the ``parser_instance.default_section`` attribute and may be modified at runtime (i.e. to convert files from one format to another). @@ -662,22 +673,39 @@ Interpolation behaviour may be customized by providing a custom handler through the *interpolation* argument. ``None`` can be used to turn off interpolation completely, ``ExtendedInterpolation()`` provides a more - advanced variant inspired by ``zc.buildout``. More on the subject in the + advanced variant inspired by ``zc.buildout``. More on the subject in the `dedicated documentation section <#interpolation-of-values>`_. :class:`RawConfigParser` has a default value of ``None``. +* *converters*, default value: not set + + Config parsers provide option value getters that perform type conversion. By + default :meth:`~ConfigParser.getint`, :meth:`~ConfigParser.getfloat`, and + :meth:`~ConfigParser.getboolean` are implemented. Should other getters be + desirable, users may define them in a subclass or pass a dictionary where each + key is a name of the converter and each value is a callable implementing said + conversion. For instance, passing ``{'decimal': decimal.Decimal}`` would add + :meth:`getdecimal` on both the parser object and all section proxies. In + other words, it will be possible to write both + ``parser_instance.getdecimal('section', 'key', fallback=0)`` and + ``parser_instance['section'].getdecimal('key', 0)``. + + If the converter needs to access the state of the parser, it can be + implemented as a method on a config parser subclass. If the name of this + method starts with ``get``, it will be available on all section proxies, in + the dict-compatible form (see the ``getdecimal()`` example above). More advanced customization may be achieved by overriding default values of -these parser attributes. The defaults are defined on the classes, so they -may be overridden by subclasses or by attribute assignment. +these parser attributes. The defaults are defined on the classes, so they may +be overridden by subclasses or by attribute assignment. -.. attribute:: BOOLEAN_STATES +.. attribute:: ConfigParser.BOOLEAN_STATES - By default when using :meth:`getboolean`, config parsers consider the - following values ``True``: ``'1'``, ``'yes'``, ``'true'``, ``'on'`` and the - following values ``False``: ``'0'``, ``'no'``, ``'false'``, ``'off'``. You - can override this by specifying a custom dictionary of strings and their - Boolean outcomes. For example: + By default when using :meth:`~ConfigParser.getboolean`, config parsers + consider the following values ``True``: ``'1'``, ``'yes'``, ``'true'``, + ``'on'`` and the following values ``False``: ``'0'``, ``'no'``, ``'false'``, + ``'off'``. You can override this by specifying a custom dictionary of strings + and their Boolean outcomes. For example: .. doctest:: @@ -694,7 +722,7 @@ Other typical Boolean pairs include ``accept``/``reject`` or ``enabled``/``disabled``. -.. method:: optionxform(option) +.. method:: ConfigParser.optionxform(option) This method transforms option names on every read, get, or set operation. The default converts the name to lowercase. This also @@ -725,15 +753,17 @@ >>> list(custom['Section2'].keys()) ['AnotherKey'] -.. attribute:: SECTCRE +.. attribute:: ConfigParser.SECTCRE - A compiled regular expression used to parse section headers. The default - matches ``[section]`` to the name ``"section"``. Whitespace is considered part - of the section name, thus ``[ larch ]`` will be read as a section of name - ``" larch "``. Override this attribute if that's unsuitable. For example: + A compiled regular expression used to parse section headers. The default + matches ``[section]`` to the name ``"section"``. Whitespace is considered + part of the section name, thus ``[ larch ]`` will be read as a section of + name ``" larch "``. Override this attribute if that's unsuitable. For + example: .. doctest:: + >>> import re >>> config = """ ... [Section 1] ... option = value @@ -741,11 +771,11 @@ ... [ Section 2 ] ... another = val ... """ - >>> typical = ConfigParser() + >>> typical = configparser.ConfigParser() >>> typical.read_string(config) >>> typical.sections() ['Section 1', ' Section 2 '] - >>> custom = ConfigParser() + >>> custom = configparser.ConfigParser() >>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]") >>> custom.read_string(config) >>> custom.sections() @@ -817,13 +847,13 @@ # Set the optional *raw* argument of get() to True if you wish to disable # interpolation in a single get operation. - print(cfg.get('Section1', 'foo', raw=False)) # -> "Python is fun!" - print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s is %(baz)s!" + print(cfg.get('Section1', 'foo', raw=False)) # -> "Python is fun!" + print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s is %(baz)s!" # The optional *vars* argument is a dict with members that will take # precedence in interpolation. print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation', - 'baz': 'evil'})) + 'baz': 'evil'})) # The optional *fallback* argument can be used to provide a fallback value print(cfg.get('Section1', 'foo')) @@ -850,10 +880,10 @@ config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'}) config.read('example.cfg') - print(config.get('Section1', 'foo')) # -> "Python is fun!" + print(config.get('Section1', 'foo')) # -> "Python is fun!" config.remove_option('Section1', 'bar') config.remove_option('Section1', 'baz') - print(config.get('Section1', 'foo')) # -> "Life is hard!" + print(config.get('Section1', 'foo')) # -> "Life is hard!" .. _configparser-objects: @@ -861,7 +891,7 @@ ConfigParser Objects -------------------- -.. class:: ConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation()) +.. class:: ConfigParser(defaults=None, dict_type=dict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters={}) The main configuration parser. When *defaults* is given, it is initialized into the dictionary of intrinsic defaults. When *dict_type* is given, it @@ -871,8 +901,8 @@ When *delimiters* is given, it is used as the set of substrings that divide keys from values. When *comment_prefixes* is given, it will be used as the set of substrings that prefix comments in otherwise empty lines. - Comments can be indented. When *inline_comment_prefixes* is given, it will be - used as the set of substrings that prefix comments in non-empty lines. + Comments can be indented. When *inline_comment_prefixes* is given, it will + be used as the set of substrings that prefix comments in non-empty lines. When *strict* is ``True`` (the default), the parser won't allow for any section or option duplicates while reading from a single source (file, @@ -886,13 +916,13 @@ When *default_section* is given, it specifies the name for the special section holding default values for other sections and interpolation purposes - (normally named ``"DEFAULT"``). This value can be retrieved and changed on + (normally named ``"DEFAULT"``). This value can be retrieved and changed on runtime using the ``default_section`` instance attribute. Interpolation behaviour may be customized by providing a custom handler through the *interpolation* argument. ``None`` can be used to turn off interpolation completely, ``ExtendedInterpolation()`` provides a more - advanced variant inspired by ``zc.buildout``. More on the subject in the + advanced variant inspired by ``zc.buildout``. More on the subject in the `dedicated documentation section <#interpolation-of-values>`_. All option names used in interpolation will be passed through the @@ -901,6 +931,12 @@ converts option names to lower case), the values ``foo %(bar)s`` and ``foo %(BAR)s`` are equivalent. + When *converters* is given, it should be a dictionary where each key + represents the name of a type converter and each value is a callable + implementing the conversion from string to the desired datatype. Every + converter gets its own corresponding :meth:`get*()` method on the parser + object and section proxies. + .. versionchanged:: 3.1 The default *dict_type* is :class:`collections.OrderedDict`. @@ -909,6 +945,17 @@ *empty_lines_in_values*, *default_section* and *interpolation* were added. + .. versionchanged:: 3.5 + The *converters* argument was added. + + .. versionchanged:: 3.7 + The *defaults* argument is read with :meth:`read_dict()`, + providing consistent behavior across the parser: non-string + keys and values are implicitly converted to strings. + + .. versionchanged:: 3.7 + The default *dict_type* is :class:`dict`, since it now preserves + insertion order. .. method:: defaults() @@ -946,20 +993,25 @@ .. method:: has_option(section, option) If the given *section* exists, and contains the given *option*, return - :const:`True`; otherwise return :const:`False`. If the specified + :const:`True`; otherwise return :const:`False`. If the specified *section* is :const:`None` or an empty string, DEFAULT is assumed. .. method:: read(filenames, encoding=None) - Attempt to read and parse a list of filenames, returning a list of - filenames which were successfully parsed. If *filenames* is a string, it - is treated as a single filename. If a file named in *filenames* cannot - be opened, that file will be ignored. This is designed so that you can - specify a list of potential configuration file locations (for example, - the current directory, the user's home directory, and some system-wide - directory), and all existing configuration files in the list will be - read. If none of the named files exist, the :class:`ConfigParser` + Attempt to read and parse an iterable of filenames, returning a list of + filenames which were successfully parsed. + + If *filenames* is a string, a :class:`bytes` object or a + :term:`path-like object`, it is treated as + a single filename. If a file named in *filenames* cannot be opened, that + file will be ignored. This is designed so that you can specify an + iterable of potential configuration file locations (for example, the + current directory, the user's home directory, and some system-wide + directory), and all existing configuration files in the iterable will be + read. + + If none of the named files exist, the :class:`ConfigParser` instance will contain an empty dataset. An application which requires initial values to be loaded from a file should load the required file or files using :meth:`read_file` before calling :meth:`read` for any @@ -976,6 +1028,12 @@ The *encoding* parameter. Previously, all files were read using the default encoding for :func:`open`. + .. versionadded:: 3.6.1 + The *filenames* parameter accepts a :term:`path-like object`. + + .. versionadded:: 3.7 + The *filenames* parameter accepts a :class:`bytes` object. + .. method:: read_file(f, source=None) @@ -1070,10 +1128,6 @@ given *section*. Optional arguments have the same meaning as for the :meth:`get` method. - .. versionchanged:: 3.2 - Items present in *vars* no longer appear in the result. The previous - behaviour mixed actual parser options with variables provided for - interpolation. .. method:: set(section, option, value) @@ -1131,20 +1185,20 @@ Use :meth:`read_file` instead. .. versionchanged:: 3.2 - :meth:`readfp` now iterates on *f* instead of calling ``f.readline()``. + :meth:`readfp` now iterates on *fp* instead of calling ``fp.readline()``. For existing code calling :meth:`readfp` with arguments which don't support iteration, the following generator may be used as a wrapper around the file-like object:: - def readline_generator(f): - line = f.readline() + def readline_generator(fp): + line = fp.readline() while line: yield line - line = f.readline() + line = fp.readline() - Instead of ``parser.readfp(f)`` use - ``parser.read_file(readline_generator(f))``. + Instead of ``parser.readfp(fp)`` use + ``parser.read_file(readline_generator(fp))``. .. data:: MAX_INTERPOLATION_DEPTH @@ -1159,7 +1213,7 @@ RawConfigParser Objects ----------------------- -.. class:: RawConfigParser(defaults=None, dict_type=collections.OrderedDict, \ +.. class:: RawConfigParser(defaults=None, dict_type=dict, \ allow_no_value=False, *, delimiters=('=', ':'), \ comment_prefixes=('#', ';'), \ inline_comment_prefixes=None, strict=True, \ @@ -1167,12 +1221,18 @@ default_section=configparser.DEFAULTSECT[, \ interpolation]) - Legacy variant of the :class:`ConfigParser` with interpolation disabled - by default and unsafe ``add_section`` and ``set`` methods. + Legacy variant of the :class:`ConfigParser`. It has interpolation + disabled by default and allows for non-string section names, option + names, and values via its unsafe ``add_section`` and ``set`` methods, + as well as the legacy ``defaults=`` keyword argument handling. + + .. versionchanged:: 3.7 + The default *dict_type* is :class:`dict`, since it now preserves + insertion order. .. note:: Consider using :class:`ConfigParser` instead which checks types of - the values to be stored internally. If you don't want interpolation, you + the values to be stored internally. If you don't want interpolation, you can use ``ConfigParser(interpolation=None)``. @@ -1183,7 +1243,7 @@ *default section* name is passed, :exc:`ValueError` is raised. Type of *section* is not checked which lets users create non-string named - sections. This behaviour is unsupported and may cause internal errors. + sections. This behaviour is unsupported and may cause internal errors. .. method:: set(section, option, value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/pyproject.toml new/configparser-3.7.1/pyproject.toml --- old/configparser-3.5.0/pyproject.toml 1970-01-01 01:00:00.000000000 +0100 +++ new/configparser-3.7.1/pyproject.toml 2019-01-25 12:09:29.000000000 +0100 @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=34.4", "wheel"] +build-backend = "setuptools.build_meta" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/setup.cfg new/configparser-3.7.1/setup.cfg --- old/configparser-3.5.0/setup.cfg 2016-05-21 10:15:06.000000000 +0200 +++ new/configparser-3.7.1/setup.cfg 2019-01-25 17:35:46.000000000 +0100 @@ -1,5 +1,40 @@ +[metadata] +name = configparser +version = 3.7.1 +long_description = file:README.rst +description = Updated configparser from Python 3.7 for Python 2.6+. +author = Łukasz Langa +author_email = luk...@langa.pl +maintainer = Jason R. Coombs +maintainer_email = jar...@jaraco.com +url = https://github.com/jaraco/configparser/ +keywords = configparser ini parsing conf cfg configuration file +platforms = any +classifiers = + Development Status :: 5 - Production/Stable + Intended Audience :: Developers + License :: OSI Approved :: MIT License + Natural Language :: English + Operating System :: OS Independent + Programming Language :: Python + 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 + Topic :: Software Development :: Libraries + Topic :: Software Development :: Libraries :: Python Modules + +[options] +install_requires = + ordereddict; python_version=="2.6" +include_package_data = True +python_requires = >=2.6 + [egg_info] tag_build = tag_date = 0 -tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/setup.py new/configparser-3.7.1/setup.py --- old/configparser-3.5.0/setup.py 2016-05-21 10:14:22.000000000 +0200 +++ new/configparser-3.7.1/setup.py 2019-01-25 15:17:29.000000000 +0100 @@ -1,65 +1,9 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""This library brings the updated configparser from Python 3.5 to Python 2.6-3.5.""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import codecs -import os import sys -from setuptools import setup, find_packages - -readme_filename = os.path.join(os.path.dirname(__file__), 'README.rst') -with codecs.open(readme_filename, encoding='utf8') as ld_file: - long_description = ld_file.read() - -requirements = [] - -if sys.version_info[0] == 2: - # bail on UTF-8 and enable `import configparser` for Python 2 - author = 'Lukasz Langa' - modules = ['configparser'] - if sys.version_info[1] < 7: - requirements.append('ordereddict') -else: - author = 'Łukasz Langa' - modules = [] +import setuptools -setup( - name='configparser', - version='3.5.0', - author=author, - author_email='luk...@langa.pl', - description=__doc__, - long_description=long_description, - url='http://docs.python.org/3/library/configparser.html', - keywords='configparser ini parsing conf cfg configuration file', - platforms=['any'], - license='MIT', - py_modules=modules, +setuptools.setup( + # enable `import configparser` for Python 2 + py_modules=['configparser'] if sys.version_info < (3,) else [], + packages=setuptools.find_packages(where='src'), package_dir={'': 'src'}, - packages=find_packages('src'), - namespace_packages=['backports'], - include_package_data=True, - zip_safe=False, - install_requires=requirements, - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Natural Language :: English', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - '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', - 'Topic :: Software Development :: Libraries', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/backports/__init__.py new/configparser-3.7.1/src/backports/__init__.py --- old/configparser-3.5.0/src/backports/__init__.py 2014-09-05 01:12:07.000000000 +0200 +++ new/configparser-3.7.1/src/backports/__init__.py 2019-01-25 12:09:29.000000000 +0100 @@ -3,9 +3,3 @@ from pkgutil import extend_path __path__ = extend_path(__path__, __name__) - -try: - import pkg_resources - pkg_resources.declare_namespace(__name__) -except ImportError: - pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/backports/configparser/__init__.py new/configparser-3.7.1/src/backports/configparser/__init__.py --- old/configparser-3.5.0/src/backports/configparser/__init__.py 2016-05-21 10:12:11.000000000 +0200 +++ new/configparser-3.7.1/src/backports/configparser/__init__.py 2019-01-25 15:17:29.000000000 +0100 @@ -64,7 +64,7 @@ Return list of configuration options for the named section. read(filenames, encoding=None) - Read and parse the list of named configuration files, given by + Read and parse the iterable of named configuration files, given by name. A single filename is also allowed. Non-existing files are ignored. Return list of successfully read files. @@ -131,6 +131,7 @@ import functools import io import itertools +import os import re import sys import warnings @@ -138,6 +139,7 @@ from backports.configparser.helpers import OrderedDict as _default_dict from backports.configparser.helpers import ChainMap as _ChainMap from backports.configparser.helpers import from_none, open, str, PY2 +from backports.configparser.helpers import PathLike, fspath __all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError", "NoOptionError", "InterpolationError", "InterpolationDepthError", @@ -606,9 +608,6 @@ self._converters = ConverterMapping(self) self._proxies = self._dict() self._proxies[default_section] = SectionProxy(self, default_section) - if defaults: - for key, value in defaults.items(): - self._defaults[self.optionxform(key)] = value self._delimiters = tuple(delimiters) if delimiters == ('=', ':'): self._optcre = self.OPTCRE_NV if allow_no_value else self.OPTCRE @@ -633,6 +632,8 @@ self._interpolation = Interpolation() if converters is not _UNSET: self._converters.update(converters) + if defaults: + self._read_defaults(defaults) def defaults(self): return self._defaults @@ -673,33 +674,23 @@ return list(opts.keys()) def read(self, filenames, encoding=None): - """Read and parse a filename or a list of filenames. + """Read and parse a filename or an iterable of filenames. Files that cannot be opened are silently ignored; this is - designed so that you can specify a list of potential + designed so that you can specify an iterable of potential configuration file locations (e.g. current directory, user's home directory, systemwide directory), and all existing - configuration files in the list will be read. A single + configuration files in the iterable will be read. A single filename may also be given. Return list of successfully read files. """ - if PY2 and isinstance(filenames, bytes): - # we allow for a little unholy magic for Python 2 so that - # people not using unicode_literals can still use the library - # conveniently - warnings.warn( - "You passed a bytestring as `filenames`. This will not work" - " on Python 3. Use `cp.read_file()` or switch to using Unicode" - " strings across the board.", - DeprecationWarning, - stacklevel=2, - ) - filenames = [filenames] - elif isinstance(filenames, str): + if isinstance(filenames, (str, bytes, PathLike)): filenames = [filenames] read_ok = [] for filename in filenames: + if isinstance(filename, PathLike): + filename = fspath(filename) try: with open(filename, encoding=encoding) as fp: self._read(fp, filename) @@ -1126,10 +1117,10 @@ # raised at the end of the file and will contain a # list of all bogus lines e = self._handle_error(e, fpname, lineno, line) + self._join_multiline_values() # if any parsing errors occurred, raise an exception if e: raise e - self._join_multiline_values() def _join_multiline_values(self): defaults = self.default_section, self._defaults @@ -1143,6 +1134,12 @@ section, name, val) + def _read_defaults(self, defaults): + """Read the defaults passed in the initializer. + Note: values can be non-string.""" + for key, value in defaults.items(): + self._defaults[self.optionxform(key)] = value + def _handle_error(self, exc, fpname, lineno, line): if not exc: exc = ParsingError(fpname) @@ -1245,6 +1242,19 @@ section, _, _ = self._validate_value_types(section=section) super(ConfigParser, self).add_section(section) + def _read_defaults(self, defaults): + """Reads the defaults passed in the initializer, implicitly converting + values to strings like the rest of the API. + + Does not perform interpolation for backwards compatibility. + """ + try: + hold_interpolation = self._interpolation + self._interpolation = Interpolation() + self.read_dict({self.default_section: defaults}) + finally: + self._interpolation = hold_interpolation + class SafeConfigParser(ConfigParser): """ConfigParser alias for backwards compatibility purposes.""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/backports/configparser/helpers.py new/configparser-3.7.1/src/backports/configparser/helpers.py --- old/configparser-3.5.0/src/backports/configparser/helpers.py 2016-05-21 08:55:42.000000000 +0200 +++ new/configparser-3.7.1/src/backports/configparser/helpers.py 2019-01-25 17:27:28.000000000 +0100 @@ -6,6 +6,9 @@ from __future__ import print_function from __future__ import unicode_literals +import abc +import os + from collections import MutableMapping try: from collections import UserDict @@ -17,6 +20,11 @@ except ImportError: from ordereddict import OrderedDict +try: + import pathlib +except ImportError: + pathlib = None + from io import open import sys try: @@ -31,6 +39,7 @@ PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3 +native_str = str str = type('str') @@ -169,3 +178,73 @@ from collections import ChainMap except ImportError: ChainMap = _ChainMap + + +_ABC = getattr( + abc, 'ABC', + # Python 3.3 compatibility + abc.ABCMeta( + native_str('__ABC'), + (object,), + dict(__metaclass__=abc.ABCMeta), + ), +) + + +class _PathLike(_ABC): + + """Abstract base class for implementing the file system path protocol.""" + + @abc.abstractmethod + def __fspath__(self): + """Return the file system path representation of the object.""" + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, subclass): + return bool( + hasattr(subclass, '__fspath__') + # workaround for Python 3.5 + or pathlib and issubclass(subclass, pathlib.Path) + ) + + +PathLike = getattr(os, 'PathLike', _PathLike) + + +def _fspath(path): + """Return the path representation of a path-like object. + + If str or bytes is passed in, it is returned unchanged. Otherwise the + os.PathLike interface is used to get the path representation. If the + path representation is not str or bytes, TypeError is raised. If the + provided path is not str, bytes, or os.PathLike, TypeError is raised. + """ + if isinstance(path, (str, bytes)): + return path + + if not hasattr(path, '__fspath__') and isinstance(path, pathlib.Path): + # workaround for Python 3.5 + return str(path) + + # Work from the object's type to match method resolution of other magic + # methods. + path_type = type(path) + try: + path_repr = path_type.__fspath__(path) + except AttributeError: + + if hasattr(path_type, '__fspath__'): + raise + else: + raise TypeError("expected str, bytes or os.PathLike object, " + "not " + path_type.__name__) + if isinstance(path_repr, (str, bytes)): + return path_repr + else: + raise TypeError("expected {}.__fspath__() to return str or bytes, " + "not {}".format(path_type.__name__, + type(path_repr).__name__)) + + +fspath = getattr(os, 'fspath', _fspath) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/configparser.egg-info/PKG-INFO new/configparser-3.7.1/src/configparser.egg-info/PKG-INFO --- old/configparser-3.5.0/src/configparser.egg-info/PKG-INFO 2016-05-21 10:15:06.000000000 +0200 +++ new/configparser-3.7.1/src/configparser.egg-info/PKG-INFO 2019-01-25 17:35:45.000000000 +0100 @@ -1,11 +1,13 @@ -Metadata-Version: 1.1 +Metadata-Version: 1.2 Name: configparser -Version: 3.5.0 -Summary: This library brings the updated configparser from Python 3.5 to Python 2.6-3.5. -Home-page: http://docs.python.org/3/library/configparser.html +Version: 3.7.1 +Summary: Updated configparser from Python 3.7 for Python 2.6+. +Home-page: https://github.com/jaraco/configparser/ Author: Łukasz Langa Author-email: luk...@langa.pl -License: MIT +Maintainer: Jason R. Coombs +Maintainer-email: jar...@jaraco.com +License: UNKNOWN Description: ============ configparser ============ @@ -140,16 +142,57 @@ Maintenance ----------- - This backport is maintained on BitBucket by Łukasz Langa, the current vanilla - ``configparser`` maintainer for CPython: + This backport was originally authored by Łukasz Langa, the current vanilla + ``configparser`` maintainer for CPython and is currently maintained by + Jason R. Coombs: - * `configparser Mercurial repository <https://bitbucket.org/ambv/configparser>`_ + * `configparser repository <https://github.com/jaraco/configparser>`_ - * `configparser issue tracker <https://bitbucket.org/ambv/configparser/issues>`_ + * `configparser issue tracker <https://github.com/jaraco/configparser/issues>`_ Change Log ---------- + 3.7.1 + ~~~~~ + + * Issue #30: Fixed issue on Python 2.x when future is present. + + 3.7.0 + ~~~~~ + + * Merge functionality from Python 3.7.2. Now ConfigParser accepts bytes + paths as well as any + `PathLike <https://docs.python.org/3/library/os.html#os.PathLike>`_ + object, including those found in the `pathlib2 backport + <https://pypi.org/project/pathlib2/>`. + + 3.5.3 + ~~~~~ + + * Issue #27: Reverted the limit on DeprecationWarning, as it had unintended + consequences. + + 3.5.2 + ~~~~~ + + * Issue #23: Use environment markers to indicate the 'ordereddict' dependency + for Python 2.6. + + * Issue #24: Limit DeprecationWarning when a filename is indicated as a + bytestring on Python 2. Now the warning is only emitted when py3kwarning + is indicated. + + 3.5.1 + ~~~~~ + + * jaraco adopts the package. + + * Moved hosting to GitHub. + + * Issue #21: Updated ``backports`` namespace package to conform with other + packages sharing the namespace. + 3.5.0 ~~~~~ @@ -256,7 +299,7 @@ CPython repository. The synchronization is currently done by manually copying the required files and stating from which CPython changeset they come from. - * the ``default`` branch holds a version of the ``3.x`` code with some tweaks + * the ``master`` branch holds a version of the ``3.x`` code with some tweaks that make it independent from libraries and constructions unavailable on 2.x. Code on this branch still *must* work on the corresponding Python 3.x but will also work on Python 2.6 and 2.7 (including PyPy). You can check this @@ -264,16 +307,17 @@ The process works like this: - 1. I update the ``3.x`` branch with new versions of files. Note that the - actual ``configparser.py`` file is now just a proxy for sources held in - ``backports/configparser/__init__.py``. + 1. In the ``3.x`` branch, run ``pip-run -- sync-upstream.py``, which + downloads the latest stable release of Python and copies the relevant + files from there into their new locations here and then commits those + changes with a nice reference to the relevant upstream commit hash. 2. I check for new names in ``__all__`` and update imports in ``configparser.py`` accordingly. I run the tests on Python 3. Commit. - 3. I merge the new commit to ``default``. I run ``tox``. Commit. + 3. I merge the new commit to ``master``. I run ``tox``. Commit. - 4. If there are necessary changes, I do them now (on ``default``). Note that + 4. If there are necessary changes, I do them now (on ``master``). Note that the changes should be written in the syntax subset supported by Python 2.6. @@ -324,5 +368,8 @@ 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: Topic :: Software Development :: Libraries Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/configparser.egg-info/SOURCES.txt new/configparser-3.7.1/src/configparser.egg-info/SOURCES.txt --- old/configparser-3.5.0/src/configparser.egg-info/SOURCES.txt 2016-05-21 10:15:06.000000000 +0200 +++ new/configparser-3.7.1/src/configparser.egg-info/SOURCES.txt 2019-01-25 17:35:46.000000000 +0100 @@ -1,6 +1,8 @@ MANIFEST.in README.rst configparser.rst +pyproject.toml +setup.cfg setup.py src/configparser.py src/backports/__init__.py @@ -9,6 +11,5 @@ src/configparser.egg-info/PKG-INFO src/configparser.egg-info/SOURCES.txt src/configparser.egg-info/dependency_links.txt -src/configparser.egg-info/namespace_packages.txt -src/configparser.egg-info/not-zip-safe +src/configparser.egg-info/requires.txt src/configparser.egg-info/top_level.txt \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/configparser.egg-info/namespace_packages.txt new/configparser-3.7.1/src/configparser.egg-info/namespace_packages.txt --- old/configparser-3.5.0/src/configparser.egg-info/namespace_packages.txt 2016-05-21 10:15:06.000000000 +0200 +++ new/configparser-3.7.1/src/configparser.egg-info/namespace_packages.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -backports diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/configparser.egg-info/not-zip-safe new/configparser-3.7.1/src/configparser.egg-info/not-zip-safe --- old/configparser-3.5.0/src/configparser.egg-info/not-zip-safe 2014-09-05 01:29:46.000000000 +0200 +++ new/configparser-3.7.1/src/configparser.egg-info/not-zip-safe 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/configparser-3.5.0/src/configparser.egg-info/requires.txt new/configparser-3.7.1/src/configparser.egg-info/requires.txt --- old/configparser-3.5.0/src/configparser.egg-info/requires.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/configparser-3.7.1/src/configparser.egg-info/requires.txt 2019-01-25 17:35:45.000000000 +0100 @@ -0,0 +1,3 @@ + +[:python_version == "2.6"] +ordereddict