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 2025-06-10 08:57:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-iniconfig (Old) and /work/SRC/openSUSE:Factory/.python-iniconfig.new.19631 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-iniconfig" Tue Jun 10 08:57:39 2025 rev:9 rq:1283362 version:2.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-iniconfig/python-iniconfig.changes 2023-09-14 16:26:22.936118140 +0200 +++ /work/SRC/openSUSE:Factory/.python-iniconfig.new.19631/python-iniconfig.changes 2025-06-10 08:58:30.182585626 +0200 @@ -1,0 +2,9 @@ +Tue Jun 3 14:18:36 UTC 2025 - Nico Krapp <nico.kr...@suse.com> + +- Update to 2.1.0 + * fix #26 - list individuals in license file by @RonnyPfannschmidt in #52 + * Run tests in CI by @nicoddemus in #53 + * Use pypa/gh-action-pypi-publish@release/v1 @ GHA by @webknjaz in #54 + * Add support for Python 3.12-3.13 and drop EOL 3.7 by @hugovk in #56 + +------------------------------------------------------------------- Old: ---- iniconfig-2.0.0-tests.tar.gz iniconfig-2.0.0.tar.gz New: ---- iniconfig-2.1.0-tests.tar.gz iniconfig-2.1.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-iniconfig.spec ++++++ --- /var/tmp/diff_new_pack.uoYd4U/_old 2025-06-10 08:58:30.814611695 +0200 +++ /var/tmp/diff_new_pack.uoYd4U/_new 2025-06-10 08:58:30.818611860 +0200 @@ -1,7 +1,7 @@ # -# spec file +# spec file for package python-iniconfig # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -27,7 +27,7 @@ %endif %{?sle15_python_module_pythons} Name: python-iniconfig%{psuffix} -Version: 2.0.0 +Version: 2.1.0 Release: 0 Summary: iniconfig: brain-dead simple config-ini parsing License: MIT @@ -35,7 +35,7 @@ URL: https://github.com/RonnyPfannschmidt/iniconfig Source: https://files.pythonhosted.org/packages/source/i/iniconfig/iniconfig-%{version}.tar.gz 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 base >= 3.8} BuildRequires: %{python_module hatch_vcs} BuildRequires: %{python_module hatchling} BuildRequires: %{python_module pip} ++++++ iniconfig-2.0.0-tests.tar.gz -> iniconfig-2.1.0-tests.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/.github/workflows/deploy.yml new/iniconfig-2.1.0/.github/workflows/deploy.yml --- old/iniconfig-2.0.0/.github/workflows/deploy.yml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/.github/workflows/deploy.yml 2025-03-19 18:28:27.000000000 +0100 @@ -15,11 +15,11 @@ runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pip key: deploy-${{ hashFiles('**/pyproject.toml') }} @@ -27,7 +27,7 @@ deploy- - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.x" @@ -50,7 +50,7 @@ - name: Publish package to PyPI if: github.event.action == 'published' - uses: pypa/gh-action-pypi-publish@master + uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ password: ${{ secrets.pypi_password }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/.github/workflows/main.yml new/iniconfig-2.1.0/.github/workflows/main.yml --- old/iniconfig-2.0.0/.github/workflows/main.yml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/.github/workflows/main.yml 2025-03-19 18:28:27.000000000 +0100 @@ -1,6 +1,6 @@ name: build -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] jobs: build: @@ -10,23 +10,26 @@ strategy: fail-fast: false matrix: - python: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] os: [ubuntu-latest, windows-latest] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} - - name: Install tox - run: python -m pip install --upgrade pip setuptools_scm hatch hatch-vcs - - name: install package local - run: pip install --no-build-isolation . + allow-prereleases: true + - name: Install hatch + run: python -m pip install --upgrade pip hatch hatch-vcs + - name: Run tests + run: hatch run +py=${{ matrix.python }} test:default --color=yes pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - - uses: pre-commit/action@v3.0.0 + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: 3.x + - uses: pre-commit/action@v3.0.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/.pre-commit-config.yaml new/iniconfig-2.1.0/.pre-commit-config.yaml --- old/iniconfig-2.0.0/.pre-commit-config.yaml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/.pre-commit-config.yaml 2025-03-19 18:28:27.000000000 +0100 @@ -3,7 +3,7 @@ rev: v3.3.1 hooks: - id: pyupgrade - args: [--py37-plus] + args: [--py38-plus] - repo: https://github.com/tox-dev/pyproject-fmt rev: "0.4.1" hooks: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/CHANGELOG new/iniconfig-2.1.0/CHANGELOG --- old/iniconfig-2.0.0/CHANGELOG 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/CHANGELOG 2025-03-19 18:28:27.000000000 +0100 @@ -1,4 +1,11 @@ -2.0.0 +2.1.0 +===== + +* fix artifact building - pin minimal version of hatch +* drop eol python 3.8 +* add python 3.12 and 3.13 + +2.0.0 ====== * add support for Python 3.7-3.11 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/LICENSE new/iniconfig-2.1.0/LICENSE --- old/iniconfig-2.0.0/LICENSE 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/LICENSE 2025-03-19 18:28:27.000000000 +0100 @@ -1,19 +1,21 @@ +The MIT License (MIT) - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +Copyright (c) 2010 - 2023 Holger Krekel and others +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/pyproject.toml new/iniconfig-2.1.0/pyproject.toml --- old/iniconfig-2.0.0/pyproject.toml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/pyproject.toml 2025-03-19 18:28:27.000000000 +0100 @@ -2,7 +2,7 @@ build-backend = "hatchling.build" requires = [ "hatch-vcs", - "hatchling", + "hatchling>=1.26", ] [project] @@ -14,7 +14,7 @@ { name = "Ronny Pfannschmidt", email = "opensou...@ronnypfannschmidt.de" }, { name = "Holger Krekel", email = "holger.kre...@gmail.com" }, ] -requires-python = ">=3.7" +requires-python = ">=3.8" dynamic = [ "version", ] @@ -27,11 +27,12 @@ "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", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries", "Topic :: Utilities", ] @@ -55,10 +56,10 @@ "pytest" ] [tool.hatch.envs.test.scripts] -default = "pytest" +default = "pytest {args}" [[tool.hatch.envs.test.matrix]] -python = ["3.7", "3.8", "3.9", "3.10", "3.11"] +python = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] [tool.setuptools_scm] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/src/iniconfig/__init__.py new/iniconfig-2.1.0/src/iniconfig/__init__.py --- old/iniconfig-2.0.0/src/iniconfig/__init__.py 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/src/iniconfig/__init__.py 2025-03-19 18:28:27.000000000 +0100 @@ -20,7 +20,7 @@ import os if TYPE_CHECKING: - from typing_extensions import Final + from typing import Final __all__ = ["IniConfig", "ParseError", "COMMENTCHARS", "iscommentline"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/src/iniconfig/exceptions.py new/iniconfig-2.1.0/src/iniconfig/exceptions.py --- old/iniconfig-2.0.0/src/iniconfig/exceptions.py 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/src/iniconfig/exceptions.py 2025-03-19 18:28:27.000000000 +0100 @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from typing_extensions import Final + from typing import Final class ParseError(Exception): ++++++ iniconfig-2.0.0-tests.tar.gz -> iniconfig-2.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/.github/workflows/deploy.yml new/iniconfig-2.1.0/.github/workflows/deploy.yml --- old/iniconfig-2.0.0/.github/workflows/deploy.yml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/.github/workflows/deploy.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,63 +0,0 @@ -name: Deploy - -on: - push: - branches: - - master - - "*deploy*" - release: - types: - - published - -jobs: - build: - if: github.repository == 'pytest-dev/iniconfig' - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Cache - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: deploy-${{ hashFiles('**/pyproject.toml') }} - restore-keys: | - deploy- - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.x" - - - name: Install build + twine - run: python -m pip install build twine setuptools_scm - - - name: git describe output - run: git describe --tags - - - id: scm_version - run: | - VERSION=$(python -m setuptools_scm --strip-dev) - echo SETUPTOOLS_SCM_PRETEND_VERSION=$VERSION >> $GITHUB_ENV - - - name: Build package - run: python -m build - - - name: twine check - run: twine check dist/* - - - name: Publish package to PyPI - if: github.event.action == 'published' - uses: pypa/gh-action-pypi-publish@master - with: - user: __token__ - password: ${{ secrets.pypi_password }} - - - name: Publish package to TestPyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.test_pypi_password }} - repository_url: https://test.pypi.org/legacy/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/.github/workflows/main.yml new/iniconfig-2.1.0/.github/workflows/main.yml --- old/iniconfig-2.0.0/.github/workflows/main.yml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/.github/workflows/main.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,32 +0,0 @@ -name: build - -on: [push, pull_request] - -jobs: - build: - - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - python: ["3.7", "3.8", "3.9", "3.10", "3.11"] - os: [ubuntu-latest, windows-latest] - - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python }} - - name: Install tox - run: python -m pip install --upgrade pip setuptools_scm hatch hatch-vcs - - name: install package local - run: pip install --no-build-isolation . - - pre-commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - - uses: pre-commit/action@v3.0.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/.pre-commit-config.yaml new/iniconfig-2.1.0/.pre-commit-config.yaml --- old/iniconfig-2.0.0/.pre-commit-config.yaml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/.pre-commit-config.yaml 1970-01-01 01:00:00.000000000 +0100 @@ -1,24 +0,0 @@ -repos: -- repo: https://github.com/asottile/pyupgrade - rev: v3.3.1 - hooks: - - id: pyupgrade - args: [--py37-plus] -- repo: https://github.com/tox-dev/pyproject-fmt - rev: "0.4.1" - hooks: - - id: pyproject-fmt - -- repo: https://github.com/psf/black - rev: 22.12.0 - hooks: - - id: black - language_version: python3 -- repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v0.991' - hooks: - - id: mypy - args: [] - additional_dependencies: - - "pytest==7.2.0" - - "tomli" \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/CHANGELOG new/iniconfig-2.1.0/CHANGELOG --- old/iniconfig-2.0.0/CHANGELOG 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/CHANGELOG 1970-01-01 01:00:00.000000000 +0100 @@ -1,52 +0,0 @@ -2.0.0 -====== - -* add support for Python 3.7-3.11 -* drop support for Python 2.6-3.6 -* add encoding argument defaulting to utf-8 -* inline and clarify type annotations -* move parsing code from inline to extra file -* add typing overloads for helper methods - - -.. note:: - - major release due to the major changes in python versions supported + changes in packaging - - the api is expected to be compatible - - -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 -- add support for Python 3.4-3.5 -- drop support for Python 2.4-2.5, 3.2 - -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-2.0.0/LICENSE new/iniconfig-2.1.0/LICENSE --- old/iniconfig-2.0.0/LICENSE 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/LICENSE 2020-02-02 01:00:00.000000000 +0100 @@ -1,19 +1,21 @@ +The MIT License (MIT) - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +Copyright (c) 2010 - 2023 Holger Krekel and others +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/MANIFEST.in new/iniconfig-2.1.0/MANIFEST.in --- old/iniconfig-2.0.0/MANIFEST.in 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/MANIFEST.in 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -include LICENSE -include example.ini -include tox.ini -include src/iniconfig/py.typed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/PKG-INFO new/iniconfig-2.1.0/PKG-INFO --- old/iniconfig-2.0.0/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 +++ new/iniconfig-2.1.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 @@ -0,0 +1,81 @@ +Metadata-Version: 2.4 +Name: iniconfig +Version: 2.1.0 +Summary: brain-dead simple config-ini parsing +Project-URL: Homepage, https://github.com/pytest-dev/iniconfig +Author-email: Ronny Pfannschmidt <opensou...@ronnypfannschmidt.de>, Holger Krekel <holger.kre...@gmail.com> +License-Expression: MIT +License-File: LICENSE +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +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.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Requires-Python: >=3.8 +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-2.0.0/example.ini new/iniconfig-2.1.0/example.ini --- old/iniconfig-2.0.0/example.ini 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.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-2.0.0/pyproject.toml new/iniconfig-2.1.0/pyproject.toml --- old/iniconfig-2.0.0/pyproject.toml 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100 @@ -2,7 +2,7 @@ build-backend = "hatchling.build" requires = [ "hatch-vcs", - "hatchling", + "hatchling>=1.26", ] [project] @@ -14,7 +14,7 @@ { name = "Ronny Pfannschmidt", email = "opensou...@ronnypfannschmidt.de" }, { name = "Holger Krekel", email = "holger.kre...@gmail.com" }, ] -requires-python = ">=3.7" +requires-python = ">=3.8" dynamic = [ "version", ] @@ -27,11 +27,12 @@ "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", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries", "Topic :: Utilities", ] @@ -55,10 +56,10 @@ "pytest" ] [tool.hatch.envs.test.scripts] -default = "pytest" +default = "pytest {args}" [[tool.hatch.envs.test.matrix]] -python = ["3.7", "3.8", "3.9", "3.10", "3.11"] +python = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] [tool.setuptools_scm] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/src/iniconfig/__init__.py new/iniconfig-2.1.0/src/iniconfig/__init__.py --- old/iniconfig-2.0.0/src/iniconfig/__init__.py 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/src/iniconfig/__init__.py 2020-02-02 01:00:00.000000000 +0100 @@ -20,7 +20,7 @@ import os if TYPE_CHECKING: - from typing_extensions import Final + from typing import Final __all__ = ["IniConfig", "ParseError", "COMMENTCHARS", "iscommentline"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/src/iniconfig/_version.py new/iniconfig-2.1.0/src/iniconfig/_version.py --- old/iniconfig-2.0.0/src/iniconfig/_version.py 1970-01-01 01:00:00.000000000 +0100 +++ new/iniconfig-2.1.0/src/iniconfig/_version.py 2020-02-02 01:00:00.000000000 +0100 @@ -0,0 +1,21 @@ +# file generated by setuptools-scm +# don't change, don't track in version control + +__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"] + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple + from typing import Union + + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '2.1.0' +__version_tuple__ = version_tuple = (2, 1, 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/src/iniconfig/exceptions.py new/iniconfig-2.1.0/src/iniconfig/exceptions.py --- old/iniconfig-2.0.0/src/iniconfig/exceptions.py 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/src/iniconfig/exceptions.py 2020-02-02 01:00:00.000000000 +0100 @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from typing_extensions import Final + from typing import Final class ParseError(Exception): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/testing/conftest.py new/iniconfig-2.1.0/testing/conftest.py --- old/iniconfig-2.0.0/testing/conftest.py 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/testing/conftest.py 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -option_doctestglob = "README.txt" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/iniconfig-2.0.0/testing/test_iniconfig.py new/iniconfig-2.1.0/testing/test_iniconfig.py --- old/iniconfig-2.0.0/testing/test_iniconfig.py 2023-01-07 12:04:39.000000000 +0100 +++ new/iniconfig-2.1.0/testing/test_iniconfig.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,305 +0,0 @@ -from __future__ import annotations -import pytest -from iniconfig import IniConfig, ParseError, __all__ as ALL -from iniconfig._parse import _ParsedLine as PL -from iniconfig import iscommentline -from textwrap import dedent -from pathlib import Path - - -check_tokens: dict[str, tuple[str, list[PL]]] = { - "section": ("[section]", [PL(0, "section", None, None)]), - "value": ("value = 1", [PL(0, None, "value", "1")]), - "value in section": ( - "[section]\nvalue=1", - [PL(0, "section", None, None), PL(1, "section", "value", "1")], - ), - "value with continuation": ( - "names =\n Alice\n Bob", - [PL(0, None, "names", "Alice\nBob")], - ), - "value with aligned continuation": ( - "names = Alice\n Bob", - [PL(0, None, "names", "Alice\nBob")], - ), - "blank line": ( - "[section]\n\nvalue=1", - [PL(0, "section", None, None), PL(2, "section", "value", "1")], - ), - "comment": ("# comment", []), - "comment on value": ("value = 1", [PL(0, None, "value", "1")]), - "comment on section": ("[section] #comment", [PL(0, "section", None, None)]), - "comment2": ("; comment", []), - "comment2 on section": ("[section] ;comment", [PL(0, "section", None, None)]), - "pseudo section syntax in value": ( - "name = value []", - [PL(0, None, "name", "value []")], - ), - "assignment in value": ("value = x = 3", [PL(0, None, "value", "x = 3")]), - "use of colon for name-values": ("name: y", [PL(0, None, "name", "y")]), - "use of colon without space": ("value:y=5", [PL(0, None, "value", "y=5")]), - "equality gets precedence": ("value=xyz:5", [PL(0, None, "value", "xyz:5")]), -} - - -@pytest.fixture(params=sorted(check_tokens)) -def input_expected(request: pytest.FixtureRequest) -> tuple[str, list[PL]]: - - return check_tokens[request.param] - - -@pytest.fixture -def input(input_expected: tuple[str, list[PL]]) -> str: - return input_expected[0] - - -@pytest.fixture -def expected(input_expected: tuple[str, list[PL]]) -> list[PL]: - return input_expected[1] - - -def parse(input: str) -> list[PL]: - from iniconfig._parse import parse_lines - - return parse_lines("sample", input.splitlines(True)) - - -def parse_a_error(input: str) -> ParseError: - try: - parse(input) - except ParseError as e: - return e - else: - raise ValueError(input) - - -def test_tokenize(input: str, expected: list[PL]) -> None: - parsed = parse(input) - assert parsed == expected - - -def test_parse_empty() -> None: - parsed = parse("") - assert not parsed - ini = IniConfig("sample", "") - assert not ini.sections - - -def test_ParseError() -> None: - e = ParseError("filename", 0, "hello") - assert str(e) == "filename:1: hello" - - -def test_continuation_needs_perceeding_token() -> None: - err = parse_a_error(" Foo") - assert err.lineno == 0 - - -def test_continuation_cant_be_after_section() -> None: - err = parse_a_error("[section]\n Foo") - assert err.lineno == 1 - - -def test_section_cant_be_empty() -> None: - err = parse_a_error("[]") - assert err.lineno == 0 - - -@pytest.mark.parametrize( - "line", - [ - "!!", - ], -) -def test_error_on_weird_lines(line: str) -> None: - parse_a_error(line) - - -def test_iniconfig_from_file(tmp_path: Path) -> None: - path = tmp_path / "test.txt" - path.write_text("[metadata]\nname=1") - - config = IniConfig(path=str(path)) - assert list(config.sections) == ["metadata"] - config = IniConfig(str(path), "[diff]") - assert list(config.sections) == ["diff"] - with pytest.raises(TypeError): - IniConfig(data=path.read_text()) # type: ignore - - -def test_iniconfig_section_first() -> None: - 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() -> None: - 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() -> None: - 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() -> None: - config = IniConfig( - "x.ini", - data=("[section]\nvalue = 1\n[section2]\n# comment\nvalue =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() -> None: - 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() -> None: - 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() -> None: - 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() -> None: - config = IniConfig("x", data="[section]\nvalue=1") - with pytest.raises(KeyError): - config["other"] - - -def test_section_getitem() -> None: - config = IniConfig("x", data="[section]\nvalue=1") - assert config["section"]["value"] == "1" - assert config["section"]["value"] == "1" - - -def test_section_iter() -> None: - 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() -> None: - 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() -> None: - 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() -> None: - 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() -> None: - 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() -> None: - assert ALL == ["IniConfig", "ParseError", "COMMENTCHARS", "iscommentline"] - - -@pytest.mark.parametrize( - "line", - [ - "#qwe", - " #qwe", - ";qwe", - " ;qwe", - ], -) -def test_iscommentline_true(line: str) -> None: - assert iscommentline(line)