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