Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-iniconfig for 
openSUSE:Factory checked in at 2023-02-25 19:54:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-iniconfig (Old)
 and      /work/SRC/openSUSE:Factory/.python-iniconfig.new.31432 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-iniconfig"

Sat Feb 25 19:54:42 2023 rev:5 rq:1061934 version:2.0.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-iniconfig/python-iniconfig.changes        
2022-12-07 17:34:17.744319255 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-iniconfig.new.31432/python-iniconfig.changes 
    2023-02-25 19:54:53.699186446 +0100
@@ -1,0 +2,9 @@
+Sun Jan 29 18:27:24 UTC 2023 - Dirk Müller <[email protected]>
+
+- update to 2.0.0:
+  * Drop Python 3.6
+  * Add Python 3.11 support
+  * type hints added
+- use gh tarball for tests
+
+-------------------------------------------------------------------

Old:
----
  iniconfig-1.1.1.tar.gz

New:
----
  iniconfig-2.0.0-tests.tar.gz
  iniconfig-2.0.0.tar.gz

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

Other differences:
------------------
++++++ python-iniconfig.spec ++++++
--- /var/tmp/diff_new_pack.VkZUg4/_old  2023-02-25 19:54:54.259189897 +0100
+++ /var/tmp/diff_new_pack.VkZUg4/_new  2023-02-25 19:54:54.267189946 +0100
@@ -1,7 +1,7 @@
 #
 # spec file
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -26,14 +26,19 @@
 %bcond_with test
 %endif
 Name:           python-iniconfig%{psuffix}
-Version:        1.1.1
+Version:        2.0.0
 Release:        0
 Summary:        iniconfig: brain-dead simple config-ini parsing
 License:        MIT
 Group:          Development/Languages/Python
 URL:            https://github.com/RonnyPfannschmidt/iniconfig
 Source:         
https://files.pythonhosted.org/packages/source/i/iniconfig/iniconfig-%{version}.tar.gz
-BuildRequires:  %{python_module setuptools}
+Source1:        
https://github.com/pytest-dev/iniconfig/archive/refs/tags/v%{version}.tar.gz#/iniconfig-%{version}-tests.tar.gz
+BuildRequires:  %{python_module base >= 3.7}
+BuildRequires:  %{python_module hatch_vcs}
+BuildRequires:  %{python_module hatchling}
+BuildRequires:  %{python_module pip}
+BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 BuildArch:      noarch
@@ -57,14 +62,14 @@
 * iniconfig raises an Error if two sections have the same name.
 
 %prep
-%setup -q -n iniconfig-%{version}
+%setup -q -n iniconfig-%{version} -a1
 
 %build
-%python_build
+%pyproject_wheel
 
 %install
 %if !%{with test}
-%python_install
+%pyproject_install
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 %endif
 
@@ -76,7 +81,7 @@
 %if !%{with test}
 %files %{python_files}
 %license LICENSE
-%doc README.txt
+%doc README.rst
 %{python_sitelib}/*
 %endif
 

++++++ iniconfig-1.1.1.tar.gz -> iniconfig-2.0.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/.gitignore 
new/iniconfig-2.0.0/.gitignore
--- old/iniconfig-1.1.1/.gitignore      2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/.gitignore      2020-02-02 01:00:00.000000000 +0100
@@ -6,3 +6,4 @@
 dist/
 __pycache__
 .tox/
+src/iniconfig/_version.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/.hgignore 
new/iniconfig-2.0.0/.hgignore
--- old/iniconfig-1.1.1/.hgignore       2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/.hgignore       1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-
-# These lines are suggested according to the svn:ignore property
-# Feel free to enable them by uncommenting them
-syntax:glob
-*.pyc
-*.pyo
-*.swp
-*.html
-*.class
-
-.tox
-
-build
-dist
-*.egg-info
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/.landscape.yml 
new/iniconfig-2.0.0/.landscape.yml
--- old/iniconfig-1.1.1/.landscape.yml  2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/.landscape.yml  1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-pep8:
-  full: true
-python-targets:
-  - 2
-  - 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/.travis.yml 
new/iniconfig-2.0.0/.travis.yml
--- old/iniconfig-1.1.1/.travis.yml     2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/.travis.yml     1970-01-01 01:00:00.000000000 +0100
@@ -1,18 +0,0 @@
-language: python
-python:
-- '2.7'
-- '3.4'
-- '3.5'
-- nightly
-- pypy
-install: pip install setuptools_scm tox
-script: tox -e py
-deploy:
-  provider: pypi
-  user: ronny
-  password:
-    secure: 
DsRVX99HA6+3JoXOVP/nPXeabJy2P73ws7Ager/e4rx3p3jS74bId09XsBU46bAT9ANmRWPR8y5DRi5Zlq0WQ2uXoR55wmsdu2KUegk6bDIS4Iop8DFxY8Kjou9s8RZbDTP27LfuYXKMO1rDW/xa6EhiotYRodekeZUz3P3MYjIi6rBV2Rz3vwmInpkKOti7AFwAsCGmCCK13irmPJEp5nwl3RgeKu2AGaolw9eypJXeNLUcNDVQ88ZUUXQCkwgq7a1BkK6NMeQLMrWAE1bD3amCbVXHCR9TaVx1ZH1dnha5Jcfj3gEFucTmInWWes5u9rypvsCkSxKtSqdiUA7BMJq7XykV7nGNplGLm2sq4+KSYlf3gZXg4XNXQkNOi4EBtRvathfFziD2SZgdtjiQX2neh0dMjf9czc/uCYkKYCFLeozdw2oQQ+BsxhQfsmU2ILGCFHyFikmDbBqZOWfQE5TN3itQqV3TFK8sOHQ8iy3MDShs+lBk9AUwbCA5YbRh8hJKhgXyEsDpisC417Pj22+TbutTj7v3Rmpe/st4hoL740grWc3PSVUBaypG0RsoafSDZWnYnTC+0aakd6QEb5S9wnMkP94kijYjjF6yUInuT05wdbQv5XcSXqAdGzBqB5jNNdfwgWVCOlwGfjnvzKllhF3PmWPW/nfmQpGOQh4=
-  on:
-    tags: true
-    distributions: sdist bdist_wheel
-    repo: RonnyPfannschmidt/iniconfig
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/CHANGELOG 
new/iniconfig-2.0.0/CHANGELOG
--- old/iniconfig-1.1.1/CHANGELOG       2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/CHANGELOG       1970-01-01 01:00:00.000000000 +0100
@@ -1,32 +0,0 @@
-1.1.1
-=========
-
-* fix version determination (thanks @florimondmanca)
-
-1.1.0
-=====
-
-- typing stubs (thanks @bluetech)
-- ci fixes
-
-1.0.1
-======
-
-pytest 5+ support
-
-1.0
-====
-
-- re-sync with pylib codebase
-
-0.2
-==================
-
-- added ability to ask "name in iniconfig", i.e. to check
-  if a section is contained.
-
-- fix bug in "name=value" parsing where value was "x=3"
-
-- allow for ': ' to delimit name=value pairs, so that e.g. .pypirc files
-  like http://docs.python.org/distutils/packageindex.html
-  can be successfully parsed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/MANIFEST.in 
new/iniconfig-2.0.0/MANIFEST.in
--- old/iniconfig-1.1.1/MANIFEST.in     2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/MANIFEST.in     1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-include LICENSE
-include example.ini
-include tox.ini
-include src/iniconfig/py.typed
-recursive-include src *.pyi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/PKG-INFO new/iniconfig-2.0.0/PKG-INFO
--- old/iniconfig-1.1.1/PKG-INFO        2020-10-14 12:20:18.000000000 +0200
+++ new/iniconfig-2.0.0/PKG-INFO        2020-02-02 01:00:00.000000000 +0100
@@ -1,76 +1,80 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: iniconfig
-Version: 1.1.1
-Summary: iniconfig: brain-dead simple config-ini parsing
-Home-page: http://github.com/RonnyPfannschmidt/iniconfig
-Author: Ronny Pfannschmidt, Holger Krekel
-Author-email: [email protected], [email protected]
-License: MIT License
-Description: iniconfig: brain-dead simple parsing of ini files
-        =======================================================
-        
-        iniconfig is a small and simple INI-file parser module
-        having a unique set of features:
-        
-        * tested against Python2.4 across to Python3.2, Jython, PyPy
-        * maintains order of sections and entries
-        * supports multi-line values with or without line-continuations
-        * supports "#" comments everywhere
-        * raises errors with proper line-numbers
-        * no bells and whistles like automatic substitutions
-        * iniconfig raises an Error if two sections have the same name.
-        
-        If you encounter issues or have feature wishes please report them to:
-        
-            http://github.com/RonnyPfannschmidt/iniconfig/issues
-        
-        Basic Example
-        ===================================
-        
-        If you have an ini file like this::
-        
-            # content of example.ini
-            [section1] # comment
-            name1=value1  # comment
-            name1b=value1,value2  # comment
-        
-            [section2]
-            name2=
-                line1
-                line2
-        
-        then you can do::
-        
-            >>> import iniconfig
-            >>> ini = iniconfig.IniConfig("example.ini")
-            >>> ini['section1']['name1'] # raises KeyError if not exists
-            'value1'
-            >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
-            ['value1', 'value2']
-            >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
-            []
-            >>> [x.name for x in list(ini)]
-            ['section1', 'section2']
-            >>> list(list(ini)[0].items())
-            [('name1', 'value1'), ('name1b', 'value1,value2')]
-            >>> 'section1' in ini
-            True
-            >>> 'inexistendsection' in ini
-            False
-        
-Platform: unix
-Platform: linux
-Platform: osx
-Platform: cygwin
-Platform: win32
+Version: 2.0.0
+Summary: brain-dead simple config-ini parsing
+Project-URL: Homepage, https://github.com/pytest-dev/iniconfig
+Author-email: Ronny Pfannschmidt <[email protected]>, Holger 
Krekel <[email protected]>
+License-Expression: MIT
+License-File: LICENSE
 Classifier: Development Status :: 4 - Beta
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
 Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
 Classifier: Topic :: Software Development :: Libraries
 Classifier: Topic :: Utilities
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
+Requires-Python: >=3.7
+Description-Content-Type: text/x-rst
+
+iniconfig: brain-dead simple parsing of ini files
+=======================================================
+
+iniconfig is a small and simple INI-file parser module
+having a unique set of features:
+
+* maintains order of sections and entries
+* supports multi-line values with or without line-continuations
+* supports "#" comments everywhere
+* raises errors with proper line-numbers
+* no bells and whistles like automatic substitutions
+* iniconfig raises an Error if two sections have the same name.
+
+If you encounter issues or have feature wishes please report them to:
+
+    https://github.com/RonnyPfannschmidt/iniconfig/issues
+
+Basic Example
+===================================
+
+If you have an ini file like this:
+
+.. code-block:: ini
+
+    # content of example.ini
+    [section1] # comment
+    name1=value1  # comment
+    name1b=value1,value2  # comment
+
+    [section2]
+    name2=
+        line1
+        line2
+
+then you can do:
+
+.. code-block:: pycon
+
+    >>> import iniconfig
+    >>> ini = iniconfig.IniConfig("example.ini")
+    >>> ini['section1']['name1'] # raises KeyError if not exists
+    'value1'
+    >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
+    ['value1', 'value2']
+    >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
+    []
+    >>> [x.name for x in list(ini)]
+    ['section1', 'section2']
+    >>> list(list(ini)[0].items())
+    [('name1', 'value1'), ('name1b', 'value1,value2')]
+    >>> 'section1' in ini
+    True
+    >>> 'inexistendsection' in ini
+    False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/README.rst 
new/iniconfig-2.0.0/README.rst
--- old/iniconfig-1.1.1/README.rst      1970-01-01 01:00:00.000000000 +0100
+++ new/iniconfig-2.0.0/README.rst      2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,54 @@
+iniconfig: brain-dead simple parsing of ini files
+=======================================================
+
+iniconfig is a small and simple INI-file parser module
+having a unique set of features:
+
+* maintains order of sections and entries
+* supports multi-line values with or without line-continuations
+* supports "#" comments everywhere
+* raises errors with proper line-numbers
+* no bells and whistles like automatic substitutions
+* iniconfig raises an Error if two sections have the same name.
+
+If you encounter issues or have feature wishes please report them to:
+
+    https://github.com/RonnyPfannschmidt/iniconfig/issues
+
+Basic Example
+===================================
+
+If you have an ini file like this:
+
+.. code-block:: ini
+
+    # content of example.ini
+    [section1] # comment
+    name1=value1  # comment
+    name1b=value1,value2  # comment
+
+    [section2]
+    name2=
+        line1
+        line2
+
+then you can do:
+
+.. code-block:: pycon
+
+    >>> import iniconfig
+    >>> ini = iniconfig.IniConfig("example.ini")
+    >>> ini['section1']['name1'] # raises KeyError if not exists
+    'value1'
+    >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
+    ['value1', 'value2']
+    >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
+    []
+    >>> [x.name for x in list(ini)]
+    ['section1', 'section2']
+    >>> list(list(ini)[0].items())
+    [('name1', 'value1'), ('name1b', 'value1,value2')]
+    >>> 'section1' in ini
+    True
+    >>> 'inexistendsection' in ini
+    False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/README.txt 
new/iniconfig-2.0.0/README.txt
--- old/iniconfig-1.1.1/README.txt      2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/README.txt      1970-01-01 01:00:00.000000000 +0100
@@ -1,51 +0,0 @@
-iniconfig: brain-dead simple parsing of ini files
-=======================================================
-
-iniconfig is a small and simple INI-file parser module
-having a unique set of features:
-
-* tested against Python2.4 across to Python3.2, Jython, PyPy
-* maintains order of sections and entries
-* supports multi-line values with or without line-continuations
-* supports "#" comments everywhere
-* raises errors with proper line-numbers
-* no bells and whistles like automatic substitutions
-* iniconfig raises an Error if two sections have the same name.
-
-If you encounter issues or have feature wishes please report them to:
-
-    http://github.com/RonnyPfannschmidt/iniconfig/issues
-
-Basic Example
-===================================
-
-If you have an ini file like this::
-
-    # content of example.ini
-    [section1] # comment
-    name1=value1  # comment
-    name1b=value1,value2  # comment
-
-    [section2]
-    name2=
-        line1
-        line2
-
-then you can do::
-
-    >>> import iniconfig
-    >>> ini = iniconfig.IniConfig("example.ini")
-    >>> ini['section1']['name1'] # raises KeyError if not exists
-    'value1'
-    >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
-    ['value1', 'value2']
-    >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
-    []
-    >>> [x.name for x in list(ini)]
-    ['section1', 'section2']
-    >>> list(list(ini)[0].items())
-    [('name1', 'value1'), ('name1b', 'value1,value2')]
-    >>> 'section1' in ini
-    True
-    >>> 'inexistendsection' in ini
-    False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/example.ini 
new/iniconfig-2.0.0/example.ini
--- old/iniconfig-1.1.1/example.ini     2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/example.ini     1970-01-01 01:00:00.000000000 +0100
@@ -1,10 +0,0 @@
-
-# content of example.ini
-[section1] # comment
-name1=value1  # comment
-name1b=value1,value2  # comment
-
-[section2]
-name2=
-    line1
-    line2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/pyproject.toml 
new/iniconfig-2.0.0/pyproject.toml
--- old/iniconfig-1.1.1/pyproject.toml  2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/pyproject.toml  2020-02-02 01:00:00.000000000 +0100
@@ -1,5 +1,70 @@
 [build-system]
-requires = ["setuptools>=41.2.0", "wheel", "setuptools_scm>3"]
+build-backend = "hatchling.build"
+requires = [
+  "hatch-vcs",
+  "hatchling",
+]
 
+[project]
+name = "iniconfig"
+description = "brain-dead simple config-ini parsing"
+readme = "README.rst"
+license = "MIT"
+authors = [
+    { name = "Ronny Pfannschmidt", email = "[email protected]" },
+    { name = "Holger Krekel", email = "[email protected]" },
+]
+requires-python = ">=3.7"
+dynamic = [
+  "version",
+]
+classifiers = [
+    "Development Status :: 4 - Beta",
+    "Intended Audience :: Developers",
+    "License :: OSI Approved :: MIT License",
+    "Operating System :: MacOS :: MacOS X",
+    "Operating System :: Microsoft :: Windows",
+    "Operating System :: POSIX",
+    "Programming Language :: Python :: 3",
+    "Programming Language :: Python :: 3 :: Only",
+    "Programming Language :: Python :: 3.7",
+    "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
+    "Topic :: Software Development :: Libraries",
+    "Topic :: Utilities",
+]
+[project.urls]
+Homepage = "https://github.com/pytest-dev/iniconfig";
 
-[tool.setuptools_scm]
\ No newline at end of file
+
+[tool.hatch.version]
+source = "vcs"
+
+[tool.hatch.build.hooks.vcs]
+version-file = "src/iniconfig/_version.py"
+
+[tool.hatch.build.targets.sdist]
+include = [
+    "/src",
+]
+
+[tool.hatch.envs.test]
+dependencies = [
+  "pytest"
+]
+[tool.hatch.envs.test.scripts]
+default = "pytest"
+
+[[tool.hatch.envs.test.matrix]]
+python = ["3.7", "3.8", "3.9", "3.10", "3.11"]
+
+[tool.setuptools_scm]
+
+[tool.mypy]
+strict = true
+
+
+[tool.pytest.ini_options]
+testpaths = "testing"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/setup.cfg 
new/iniconfig-2.0.0/setup.cfg
--- old/iniconfig-1.1.1/setup.cfg       2020-10-14 12:20:18.000000000 +0200
+++ new/iniconfig-2.0.0/setup.cfg       1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-[bdist_wheel]
-universal = 1
-
-[egg_info]
-tag_build = 
-tag_date = 0
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/setup.py new/iniconfig-2.0.0/setup.py
--- old/iniconfig-1.1.1/setup.py        2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/setup.py        1970-01-01 01:00:00.000000000 +0100
@@ -1,46 +0,0 @@
-"""
-iniconfig: brain-dead simple config-ini parsing.
-
-compatible CPython 2.3 through to CPython 3.2, Jython, PyPy
-
-(c) 2010 Ronny Pfannschmidt, Holger Krekel
-"""
-
-from setuptools import setup
-
-
-def main():
-    with open('README.txt') as fp:
-        readme = fp.read()
-    setup(
-        name='iniconfig',
-        packages=['iniconfig'],
-        package_dir={'': 'src'},
-        description='iniconfig: brain-dead simple config-ini parsing',
-        long_description=readme,
-        use_scm_version=True,
-        url='http://github.com/RonnyPfannschmidt/iniconfig',
-        license='MIT License',
-        platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
-        author='Ronny Pfannschmidt, Holger Krekel',
-        author_email=(
-            '[email protected], [email protected]'),
-        classifiers=[
-            'Development Status :: 4 - Beta',
-            'Intended Audience :: Developers',
-            'License :: OSI Approved :: MIT License',
-            'Operating System :: POSIX',
-            'Operating System :: Microsoft :: Windows',
-            'Operating System :: MacOS :: MacOS X',
-            'Topic :: Software Development :: Libraries',
-            'Topic :: Utilities',
-            'Programming Language :: Python',
-            'Programming Language :: Python :: 2',
-            'Programming Language :: Python :: 3',
-        ],
-        include_package_data=True,
-        zip_safe=False,
-    )
-
-if __name__ == '__main__':
-    main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig/__init__.py 
new/iniconfig-2.0.0/src/iniconfig/__init__.py
--- old/iniconfig-1.1.1/src/iniconfig/__init__.py       2020-10-14 
12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/src/iniconfig/__init__.py       2020-02-02 
01:00:00.000000000 +0100
@@ -1,165 +1,216 @@
 """ brain-dead simple parser for ini-style files.
 (C) Ronny Pfannschmidt, Holger Krekel -- MIT licensed
 """
-__all__ = ['IniConfig', 'ParseError']
+from __future__ import annotations
+from typing import (
+    Callable,
+    Iterator,
+    Mapping,
+    Optional,
+    Tuple,
+    TypeVar,
+    Union,
+    TYPE_CHECKING,
+    NoReturn,
+    NamedTuple,
+    overload,
+    cast,
+)
+
+import os
+
+if TYPE_CHECKING:
+    from typing_extensions import Final
+
+__all__ = ["IniConfig", "ParseError", "COMMENTCHARS", "iscommentline"]
+
+from .exceptions import ParseError
+from . import _parse
+from ._parse import COMMENTCHARS, iscommentline
+
+_D = TypeVar("_D")
+_T = TypeVar("_T")
+
+
+class SectionWrapper:
+    config: Final[IniConfig]
+    name: Final[str]
 
-COMMENTCHARS = "#;"
-
-
-class ParseError(Exception):
-    def __init__(self, path, lineno, msg):
-        Exception.__init__(self, path, lineno, msg)
-        self.path = path
-        self.lineno = lineno
-        self.msg = msg
-
-    def __str__(self):
-        return "%s:%s: %s" % (self.path, self.lineno+1, self.msg)
-
-
-class SectionWrapper(object):
-    def __init__(self, config, name):
+    def __init__(self, config: IniConfig, name: str) -> None:
         self.config = config
         self.name = name
 
-    def lineof(self, name):
+    def lineof(self, name: str) -> int | None:
         return self.config.lineof(self.name, name)
 
-    def get(self, key, default=None, convert=str):
-        return self.config.get(self.name, key,
-                               convert=convert, default=default)
+    @overload
+    def get(self, key: str) -> str | None:
+        ...
+
+    @overload
+    def get(
+        self,
+        key: str,
+        convert: Callable[[str], _T],
+    ) -> _T | None:
+        ...
+
+    @overload
+    def get(
+        self,
+        key: str,
+        default: None,
+        convert: Callable[[str], _T],
+    ) -> _T | None:
+        ...
+
+    @overload
+    def get(self, key: str, default: _D, convert: None = None) -> str | _D:
+        ...
+
+    @overload
+    def get(
+        self,
+        key: str,
+        default: _D,
+        convert: Callable[[str], _T],
+    ) -> _T | _D:
+        ...
+
+    # TODO: investigate possible mypy bug wrt matching the passed over data
+    def get(  # type: ignore [misc]
+        self,
+        key: str,
+        default: _D | None = None,
+        convert: Callable[[str], _T] | None = None,
+    ) -> _D | _T | str | None:
+        return self.config.get(self.name, key, convert=convert, 
default=default)
 
-    def __getitem__(self, key):
+    def __getitem__(self, key: str) -> str:
         return self.config.sections[self.name][key]
 
-    def __iter__(self):
-        section = self.config.sections.get(self.name, [])
+    def __iter__(self) -> Iterator[str]:
+        section: Mapping[str, str] = self.config.sections.get(self.name, {})
+
+        def lineof(key: str) -> int:
+            return self.config.lineof(self.name, key)  # type: 
ignore[return-value]
 
-        def lineof(key):
-            return self.config.lineof(self.name, key)
-        for name in sorted(section, key=lineof):
-            yield name
+        yield from sorted(section, key=lineof)
 
-    def items(self):
+    def items(self) -> Iterator[tuple[str, str]]:
         for name in self:
             yield name, self[name]
 
 
-class IniConfig(object):
-    def __init__(self, path, data=None):
-        self.path = str(path)  # convenience
+class IniConfig:
+    path: Final[str]
+    sections: Final[Mapping[str, Mapping[str, str]]]
+
+    def __init__(
+        self,
+        path: str | os.PathLike[str],
+        data: str | None = None,
+        encoding: str = "utf-8",
+    ) -> None:
+        self.path = os.fspath(path)
         if data is None:
-            f = open(self.path)
-            try:
-                tokens = self._parse(iter(f))
-            finally:
-                f.close()
-        else:
-            tokens = self._parse(data.splitlines(True))
+            with open(self.path, encoding=encoding) as fp:
+                data = fp.read()
+
+        tokens = _parse.parse_lines(self.path, data.splitlines(True))
 
         self._sources = {}
-        self.sections = {}
+        sections_data: dict[str, dict[str, str]]
+        self.sections = sections_data = {}
 
         for lineno, section, name, value in tokens:
             if section is None:
-                self._raise(lineno, 'no section header defined')
+                raise ParseError(self.path, lineno, "no section header 
defined")
             self._sources[section, name] = lineno
             if name is None:
                 if section in self.sections:
-                    self._raise(lineno, 'duplicate section %r' % (section, ))
-                self.sections[section] = {}
+                    raise ParseError(
+                        self.path, lineno, f"duplicate section {section!r}"
+                    )
+                sections_data[section] = {}
             else:
                 if name in self.sections[section]:
-                    self._raise(lineno, 'duplicate name %r' % (name, ))
-                self.sections[section][name] = value
+                    raise ParseError(self.path, lineno, f"duplicate name 
{name!r}")
+                assert value is not None
+                sections_data[section][name] = value
 
-    def _raise(self, lineno, msg):
-        raise ParseError(self.path, lineno, msg)
-
-    def _parse(self, line_iter):
-        result = []
-        section = None
-        for lineno, line in enumerate(line_iter):
-            name, data = self._parseline(line, lineno)
-            # new value
-            if name is not None and data is not None:
-                result.append((lineno, section, name, data))
-            # new section
-            elif name is not None and data is None:
-                if not name:
-                    self._raise(lineno, 'empty section name')
-                section = name
-                result.append((lineno, section, None, None))
-            # continuation
-            elif name is None and data is not None:
-                if not result:
-                    self._raise(lineno, 'unexpected value continuation')
-                last = result.pop()
-                last_name, last_data = last[-2:]
-                if last_name is None:
-                    self._raise(lineno, 'unexpected value continuation')
-
-                if last_data:
-                    data = '%s\n%s' % (last_data, data)
-                result.append(last[:-1] + (data,))
-        return result
-
-    def _parseline(self, line, lineno):
-        # blank lines
-        if iscommentline(line):
-            line = ""
-        else:
-            line = line.rstrip()
-        if not line:
-            return None, None
-        # section
-        if line[0] == '[':
-            realline = line
-            for c in COMMENTCHARS:
-                line = line.split(c)[0].rstrip()
-            if line[-1] == "]":
-                return line[1:-1], None
-            return None, realline.strip()
-        # value
-        elif not line[0].isspace():
-            try:
-                name, value = line.split('=', 1)
-                if ":" in name:
-                    raise ValueError()
-            except ValueError:
-                try:
-                    name, value = line.split(":", 1)
-                except ValueError:
-                    self._raise(lineno, 'unexpected line: %r' % line)
-            return name.strip(), value.strip()
-        # continuation
-        else:
-            return None, line.strip()
-
-    def lineof(self, section, name=None):
+    def lineof(self, section: str, name: str | None = None) -> int | None:
         lineno = self._sources.get((section, name))
-        if lineno is not None:
-            return lineno + 1
+        return None if lineno is None else lineno + 1
 
-    def get(self, section, name, default=None, convert=str):
+    @overload
+    def get(
+        self,
+        section: str,
+        name: str,
+    ) -> str | None:
+        ...
+
+    @overload
+    def get(
+        self,
+        section: str,
+        name: str,
+        convert: Callable[[str], _T],
+    ) -> _T | None:
+        ...
+
+    @overload
+    def get(
+        self,
+        section: str,
+        name: str,
+        default: None,
+        convert: Callable[[str], _T],
+    ) -> _T | None:
+        ...
+
+    @overload
+    def get(
+        self, section: str, name: str, default: _D, convert: None = None
+    ) -> str | _D:
+        ...
+
+    @overload
+    def get(
+        self,
+        section: str,
+        name: str,
+        default: _D,
+        convert: Callable[[str], _T],
+    ) -> _T | _D:
+        ...
+
+    def get(  # type: ignore
+        self,
+        section: str,
+        name: str,
+        default: _D | None = None,
+        convert: Callable[[str], _T] | None = None,
+    ) -> _D | _T | str | None:
         try:
-            return convert(self.sections[section][name])
+            value: str = self.sections[section][name]
         except KeyError:
             return default
+        else:
+            if convert is not None:
+                return convert(value)
+            else:
+                return value
 
-    def __getitem__(self, name):
+    def __getitem__(self, name: str) -> SectionWrapper:
         if name not in self.sections:
             raise KeyError(name)
         return SectionWrapper(self, name)
 
-    def __iter__(self):
-        for name in sorted(self.sections, key=self.lineof):
+    def __iter__(self) -> Iterator[SectionWrapper]:
+        for name in sorted(self.sections, key=self.lineof):  # type: ignore
             yield SectionWrapper(self, name)
 
-    def __contains__(self, arg):
+    def __contains__(self, arg: str) -> bool:
         return arg in self.sections
-
-
-def iscommentline(line):
-    c = line.lstrip()[:1]
-    return c in COMMENTCHARS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig/__init__.pyi 
new/iniconfig-2.0.0/src/iniconfig/__init__.pyi
--- old/iniconfig-1.1.1/src/iniconfig/__init__.pyi      2020-10-14 
12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/src/iniconfig/__init__.pyi      1970-01-01 
01:00:00.000000000 +0100
@@ -1,31 +0,0 @@
-from typing import Callable, Iterator, Mapping, Optional, Tuple, TypeVar, Union
-from typing_extensions import Final
-
-_D = TypeVar('_D')
-_T = TypeVar('_T')
-
-class ParseError(Exception):
-    # Private __init__.
-    path: Final[str]
-    lineno: Final[int]
-    msg: Final[str]
-
-class SectionWrapper:
-    # Private __init__.
-    config: Final[IniConfig]
-    name: Final[str]
-    def __getitem__(self, key: str) -> str: ...
-    def __iter__(self) -> Iterator[str]: ...
-    def get(self, key: str, default: _D = ..., convert: Callable[[str], _T] = 
...) -> Union[_T, _D]: ...
-    def items(self) -> Iterator[Tuple[str, str]]: ...
-    def lineof(self, name: str) -> Optional[int]: ...
-
-class IniConfig:
-    path: Final[str]
-    sections: Final[Mapping[str, Mapping[str, str]]]
-    def __init__(self, path: str, data: Optional[str] = None): ...
-    def __contains__(self, arg: str) -> bool: ...
-    def __getitem__(self, name: str) -> SectionWrapper: ...
-    def __iter__(self) -> Iterator[SectionWrapper]: ...
-    def get(self, section: str, name: str, default: _D = ..., convert: 
Callable[[str], _T] = ...) -> Union[_T, _D]: ...
-    def lineof(self, section: str, name: Optional[str] = ...) -> 
Optional[int]: ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig/_parse.py 
new/iniconfig-2.0.0/src/iniconfig/_parse.py
--- old/iniconfig-1.1.1/src/iniconfig/_parse.py 1970-01-01 01:00:00.000000000 
+0100
+++ new/iniconfig-2.0.0/src/iniconfig/_parse.py 2020-02-02 01:00:00.000000000 
+0100
@@ -0,0 +1,82 @@
+from __future__ import annotations
+from .exceptions import ParseError
+
+from typing import NamedTuple
+
+
+COMMENTCHARS = "#;"
+
+
+class _ParsedLine(NamedTuple):
+    lineno: int
+    section: str | None
+    name: str | None
+    value: str | None
+
+
+def parse_lines(path: str, line_iter: list[str]) -> list[_ParsedLine]:
+    result: list[_ParsedLine] = []
+    section = None
+    for lineno, line in enumerate(line_iter):
+        name, data = _parseline(path, line, lineno)
+        # new value
+        if name is not None and data is not None:
+            result.append(_ParsedLine(lineno, section, name, data))
+        # new section
+        elif name is not None and data is None:
+            if not name:
+                raise ParseError(path, lineno, "empty section name")
+            section = name
+            result.append(_ParsedLine(lineno, section, None, None))
+        # continuation
+        elif name is None and data is not None:
+            if not result:
+                raise ParseError(path, lineno, "unexpected value continuation")
+            last = result.pop()
+            if last.name is None:
+                raise ParseError(path, lineno, "unexpected value continuation")
+
+            if last.value:
+                last = last._replace(value=f"{last.value}\n{data}")
+            else:
+                last = last._replace(value=data)
+            result.append(last)
+    return result
+
+
+def _parseline(path: str, line: str, lineno: int) -> tuple[str | None, str | 
None]:
+    # blank lines
+    if iscommentline(line):
+        line = ""
+    else:
+        line = line.rstrip()
+    if not line:
+        return None, None
+    # section
+    if line[0] == "[":
+        realline = line
+        for c in COMMENTCHARS:
+            line = line.split(c)[0].rstrip()
+        if line[-1] == "]":
+            return line[1:-1], None
+        return None, realline.strip()
+    # value
+    elif not line[0].isspace():
+        try:
+            name, value = line.split("=", 1)
+            if ":" in name:
+                raise ValueError()
+        except ValueError:
+            try:
+                name, value = line.split(":", 1)
+            except ValueError:
+                raise ParseError(path, lineno, "unexpected line: %r" % line)
+        return name.strip(), value.strip()
+    # continuation
+    else:
+        return None, line.strip()
+
+
+def iscommentline(line: str) -> bool:
+    c = line.lstrip()[:1]
+    return c in COMMENTCHARS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig/_version.py 
new/iniconfig-2.0.0/src/iniconfig/_version.py
--- old/iniconfig-1.1.1/src/iniconfig/_version.py       1970-01-01 
01:00:00.000000000 +0100
+++ new/iniconfig-2.0.0/src/iniconfig/_version.py       2020-02-02 
01:00:00.000000000 +0100
@@ -0,0 +1,4 @@
+# file generated by setuptools_scm
+# don't change, don't track in version control
+__version__ = version = '2.0.0'
+__version_tuple__ = version_tuple = (2, 0, 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig/exceptions.py 
new/iniconfig-2.0.0/src/iniconfig/exceptions.py
--- old/iniconfig-1.1.1/src/iniconfig/exceptions.py     1970-01-01 
01:00:00.000000000 +0100
+++ new/iniconfig-2.0.0/src/iniconfig/exceptions.py     2020-02-02 
01:00:00.000000000 +0100
@@ -0,0 +1,20 @@
+from __future__ import annotations
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from typing_extensions import Final
+
+
+class ParseError(Exception):
+    path: Final[str]
+    lineno: Final[int]
+    msg: Final[str]
+
+    def __init__(self, path: str, lineno: int, msg: str) -> None:
+        super().__init__(path, lineno, msg)
+        self.path = path
+        self.lineno = lineno
+        self.msg = msg
+
+    def __str__(self) -> str:
+        return f"{self.path}:{self.lineno + 1}: {self.msg}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig.egg-info/PKG-INFO 
new/iniconfig-2.0.0/src/iniconfig.egg-info/PKG-INFO
--- old/iniconfig-1.1.1/src/iniconfig.egg-info/PKG-INFO 2020-10-14 
12:20:17.000000000 +0200
+++ new/iniconfig-2.0.0/src/iniconfig.egg-info/PKG-INFO 1970-01-01 
01:00:00.000000000 +0100
@@ -1,76 +0,0 @@
-Metadata-Version: 1.1
-Name: iniconfig
-Version: 1.1.1
-Summary: iniconfig: brain-dead simple config-ini parsing
-Home-page: http://github.com/RonnyPfannschmidt/iniconfig
-Author: Ronny Pfannschmidt, Holger Krekel
-Author-email: [email protected], [email protected]
-License: MIT License
-Description: iniconfig: brain-dead simple parsing of ini files
-        =======================================================
-        
-        iniconfig is a small and simple INI-file parser module
-        having a unique set of features:
-        
-        * tested against Python2.4 across to Python3.2, Jython, PyPy
-        * maintains order of sections and entries
-        * supports multi-line values with or without line-continuations
-        * supports "#" comments everywhere
-        * raises errors with proper line-numbers
-        * no bells and whistles like automatic substitutions
-        * iniconfig raises an Error if two sections have the same name.
-        
-        If you encounter issues or have feature wishes please report them to:
-        
-            http://github.com/RonnyPfannschmidt/iniconfig/issues
-        
-        Basic Example
-        ===================================
-        
-        If you have an ini file like this::
-        
-            # content of example.ini
-            [section1] # comment
-            name1=value1  # comment
-            name1b=value1,value2  # comment
-        
-            [section2]
-            name2=
-                line1
-                line2
-        
-        then you can do::
-        
-            >>> import iniconfig
-            >>> ini = iniconfig.IniConfig("example.ini")
-            >>> ini['section1']['name1'] # raises KeyError if not exists
-            'value1'
-            >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
-            ['value1', 'value2']
-            >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
-            []
-            >>> [x.name for x in list(ini)]
-            ['section1', 'section2']
-            >>> list(list(ini)[0].items())
-            [('name1', 'value1'), ('name1b', 'value1,value2')]
-            >>> 'section1' in ini
-            True
-            >>> 'inexistendsection' in ini
-            False
-        
-Platform: unix
-Platform: linux
-Platform: osx
-Platform: cygwin
-Platform: win32
-Classifier: Development Status :: 4 - Beta
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Utilities
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig.egg-info/SOURCES.txt 
new/iniconfig-2.0.0/src/iniconfig.egg-info/SOURCES.txt
--- old/iniconfig-1.1.1/src/iniconfig.egg-info/SOURCES.txt      2020-10-14 
12:20:18.000000000 +0200
+++ new/iniconfig-2.0.0/src/iniconfig.egg-info/SOURCES.txt      1970-01-01 
01:00:00.000000000 +0100
@@ -1,23 +0,0 @@
-.gitignore
-.hgignore
-.landscape.yml
-.travis.yml
-CHANGELOG
-LICENSE
-MANIFEST.in
-README.txt
-example.ini
-pyproject.toml
-setup.cfg
-setup.py
-tox.ini
-src/iniconfig/__init__.py
-src/iniconfig/__init__.pyi
-src/iniconfig/py.typed
-src/iniconfig.egg-info/PKG-INFO
-src/iniconfig.egg-info/SOURCES.txt
-src/iniconfig.egg-info/dependency_links.txt
-src/iniconfig.egg-info/not-zip-safe
-src/iniconfig.egg-info/top_level.txt
-testing/conftest.py
-testing/test_iniconfig.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/iniconfig-1.1.1/src/iniconfig.egg-info/dependency_links.txt 
new/iniconfig-2.0.0/src/iniconfig.egg-info/dependency_links.txt
--- old/iniconfig-1.1.1/src/iniconfig.egg-info/dependency_links.txt     
2020-10-14 12:20:17.000000000 +0200
+++ new/iniconfig-2.0.0/src/iniconfig.egg-info/dependency_links.txt     
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/src/iniconfig.egg-info/not-zip-safe 
new/iniconfig-2.0.0/src/iniconfig.egg-info/not-zip-safe
--- old/iniconfig-1.1.1/src/iniconfig.egg-info/not-zip-safe     2020-10-14 
12:20:17.000000000 +0200
+++ new/iniconfig-2.0.0/src/iniconfig.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/iniconfig-1.1.1/src/iniconfig.egg-info/top_level.txt 
new/iniconfig-2.0.0/src/iniconfig.egg-info/top_level.txt
--- old/iniconfig-1.1.1/src/iniconfig.egg-info/top_level.txt    2020-10-14 
12:20:17.000000000 +0200
+++ new/iniconfig-2.0.0/src/iniconfig.egg-info/top_level.txt    1970-01-01 
01:00:00.000000000 +0100
@@ -1 +0,0 @@
-iniconfig
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/testing/conftest.py 
new/iniconfig-2.0.0/testing/conftest.py
--- old/iniconfig-1.1.1/testing/conftest.py     2020-10-14 12:19:54.000000000 
+0200
+++ new/iniconfig-2.0.0/testing/conftest.py     1970-01-01 01:00:00.000000000 
+0100
@@ -1,2 +0,0 @@
-
-option_doctestglob = "README.txt"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/testing/test_iniconfig.py 
new/iniconfig-2.0.0/testing/test_iniconfig.py
--- old/iniconfig-1.1.1/testing/test_iniconfig.py       2020-10-14 
12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/testing/test_iniconfig.py       1970-01-01 
01:00:00.000000000 +0100
@@ -1,314 +0,0 @@
-import py
-import pytest
-from iniconfig import IniConfig, ParseError, __all__ as ALL
-from iniconfig import iscommentline
-from textwrap import dedent
-
-
-check_tokens = {
-    'section': (
-        '[section]',
-        [(0, 'section', None, None)]
-    ),
-    'value': (
-        'value = 1',
-        [(0, None, 'value', '1')]
-    ),
-    'value in section': (
-        '[section]\nvalue=1',
-        [(0, 'section', None, None), (1, 'section', 'value', '1')]
-    ),
-    'value with continuation': (
-        'names =\n Alice\n Bob',
-        [(0, None, 'names', 'Alice\nBob')]
-    ),
-    'value with aligned continuation': (
-        'names = Alice\n'
-        '        Bob',
-        [(0, None, 'names', 'Alice\nBob')]
-    ),
-    'blank line': (
-        '[section]\n\nvalue=1',
-        [(0, 'section', None, None), (2, 'section', 'value', '1')]
-    ),
-    'comment': (
-        '# comment',
-        []
-    ),
-    'comment on value': (
-        'value = 1',
-        [(0, None, 'value', '1')]
-    ),
-
-    'comment on section': (
-        '[section] #comment',
-        [(0, 'section', None, None)]
-    ),
-    'comment2': (
-        '; comment',
-        []
-    ),
-
-    'comment2 on section': (
-        '[section] ;comment',
-        [(0, 'section', None, None)]
-    ),
-    'pseudo section syntax in value': (
-        'name = value []',
-        [(0, None, 'name', 'value []')]
-    ),
-    'assignment in value': (
-        'value = x = 3',
-        [(0, None, 'value', 'x = 3')]
-    ),
-    'use of colon for name-values': (
-        'name: y',
-        [(0, None, 'name', 'y')]
-    ),
-    'use of colon without space': (
-        'value:y=5',
-        [(0, None, 'value', 'y=5')]
-    ),
-    'equality gets precedence': (
-        'value=xyz:5',
-        [(0, None, 'value', 'xyz:5')]
-    ),
-
-}
-
-
[email protected](params=sorted(check_tokens))
-def input_expected(request):
-    return check_tokens[request.param]
-
-
[email protected]
-def input(input_expected):
-    return input_expected[0]
-
-
[email protected]
-def expected(input_expected):
-    return input_expected[1]
-
-
-def parse(input):
-    # only for testing purposes - _parse() does not use state except path
-    ini = object.__new__(IniConfig)
-    ini.path = "sample"
-    return ini._parse(input.splitlines(True))
-
-
-def parse_a_error(input):
-    return py.test.raises(ParseError, parse, input)
-
-
-def test_tokenize(input, expected):
-    parsed = parse(input)
-    assert parsed == expected
-
-
-def test_parse_empty():
-    parsed = parse("")
-    assert not parsed
-    ini = IniConfig("sample", "")
-    assert not ini.sections
-
-
-def test_ParseError():
-    e = ParseError("filename", 0, "hello")
-    assert str(e) == "filename:1: hello"
-
-
-def test_continuation_needs_perceeding_token():
-    excinfo = parse_a_error(' Foo')
-    assert excinfo.value.lineno == 0
-
-
-def test_continuation_cant_be_after_section():
-    excinfo = parse_a_error('[section]\n Foo')
-    assert excinfo.value.lineno == 1
-
-
-def test_section_cant_be_empty():
-    excinfo = parse_a_error('[]')
-    assert excinfo.value.lineno == 0
-
-
[email protected]('line', [
-    '!!',
-    ])
-def test_error_on_weird_lines(line):
-    parse_a_error(line)
-
-
-def test_iniconfig_from_file(tmpdir):
-    path = tmpdir/'test.txt'
-    path.write('[metadata]\nname=1')
-
-    config = IniConfig(path=path)
-    assert list(config.sections) == ['metadata']
-    config = IniConfig(path, "[diff]")
-    assert list(config.sections) == ['diff']
-    with pytest.raises(TypeError):
-        IniConfig(data=path.read())
-
-
-def test_iniconfig_section_first(tmpdir):
-    with pytest.raises(ParseError) as excinfo:
-        IniConfig("x", data='name=1')
-    assert excinfo.value.msg == "no section header defined"
-
-
-def test_iniconig_section_duplicate_fails():
-    with pytest.raises(ParseError) as excinfo:
-        IniConfig("x", data='[section]\n[section]')
-    assert 'duplicate section' in str(excinfo.value)
-
-
-def test_iniconfig_duplicate_key_fails():
-    with pytest.raises(ParseError) as excinfo:
-        IniConfig("x", data='[section]\nname = Alice\nname = bob')
-
-    assert 'duplicate name' in str(excinfo.value)
-
-
-def test_iniconfig_lineof():
-    config = IniConfig("x.ini", data=(
-        '[section]\n'
-        'value = 1\n'
-        '[section2]\n'
-        '# comment\n'
-        'value =2'
-    ))
-
-    assert config.lineof('missing') is None
-    assert config.lineof('section') == 1
-    assert config.lineof('section2') == 3
-    assert config.lineof('section', 'value') == 2
-    assert config.lineof('section2', 'value') == 5
-
-    assert config['section'].lineof('value') == 2
-    assert config['section2'].lineof('value') == 5
-
-
-def test_iniconfig_get_convert():
-    config = IniConfig("x", data='[section]\nint = 1\nfloat = 1.1')
-    assert config.get('section', 'int') == '1'
-    assert config.get('section', 'int', convert=int) == 1
-
-
-def test_iniconfig_get_missing():
-    config = IniConfig("x", data='[section]\nint = 1\nfloat = 1.1')
-    assert config.get('section', 'missing', default=1) == 1
-    assert config.get('section', 'missing') is None
-
-
-def test_section_get():
-    config = IniConfig("x", data='[section]\nvalue=1')
-    section = config['section']
-    assert section.get('value', convert=int) == 1
-    assert section.get('value', 1) == "1"
-    assert section.get('missing', 2) == 2
-
-
-def test_missing_section():
-    config = IniConfig("x", data='[section]\nvalue=1')
-    with pytest.raises(KeyError):
-            config["other"]
-
-
-def test_section_getitem():
-    config = IniConfig("x", data='[section]\nvalue=1')
-    assert config['section']['value'] == '1'
-    assert config['section']['value'] == '1'
-
-
-def test_section_iter():
-    config = IniConfig("x", data='[section]\nvalue=1')
-    names = list(config['section'])
-    assert names == ['value']
-    items = list(config['section'].items())
-    assert items == [('value', '1')]
-
-
-def test_config_iter():
-    config = IniConfig("x.ini", data=dedent('''
-          [section1]
-          value=1
-          [section2]
-          value=2
-    '''))
-    l = list(config)
-    assert len(l) == 2
-    assert l[0].name == 'section1'
-    assert l[0]['value'] == '1'
-    assert l[1].name == 'section2'
-    assert l[1]['value'] == '2'
-
-
-def test_config_contains():
-    config = IniConfig("x.ini", data=dedent('''
-          [section1]
-          value=1
-          [section2]
-          value=2
-    '''))
-    assert 'xyz' not in config
-    assert 'section1' in config
-    assert 'section2' in config
-
-
-def test_iter_file_order():
-    config = IniConfig("x.ini", data="""
-[section2] #cpython dict ordered before section
-value = 1
-value2 = 2 # dict ordered before value
-[section]
-a = 1
-b = 2
-""")
-    l = list(config)
-    secnames = [x.name for x in l]
-    assert secnames == ['section2', 'section']
-    assert list(config['section2']) == ['value', 'value2']
-    assert list(config['section']) == ['a', 'b']
-
-
-def test_example_pypirc():
-    config = IniConfig("pypirc", data=dedent('''
-        [distutils]
-        index-servers =
-            pypi
-            other
-
-        [pypi]
-        repository: <repository-url>
-        username: <username>
-        password: <password>
-
-        [other]
-        repository: http://example.com/pypi
-        username: <username>
-        password: <password>
-    '''))
-    distutils, pypi, other = list(config)
-    assert distutils["index-servers"] == "pypi\nother"
-    assert pypi['repository'] == '<repository-url>'
-    assert pypi['username'] == '<username>'
-    assert pypi['password'] == '<password>'
-    assert ['repository', 'username', 'password'] == list(other)
-
-
-def test_api_import():
-    assert ALL == ['IniConfig', 'ParseError']
-
-
[email protected]("line", [
-    "#qwe",
-    "  #qwe",
-    ";qwe",
-    " ;qwe",
-])
-def test_iscommentline_true(line):
-    assert iscommentline(line)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iniconfig-1.1.1/tox.ini new/iniconfig-2.0.0/tox.ini
--- old/iniconfig-1.1.1/tox.ini 2020-10-14 12:19:54.000000000 +0200
+++ new/iniconfig-2.0.0/tox.ini 1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-[tox]
-envlist=py27,py26,py33,py34,py35
-
-
-[testenv]
-commands=
-  pytest {posargs}
-deps=
-  pytest
-
-
-[pytest]
-testpaths=
-  testing

Reply via email to