diff --git a/.gitignore b/.gitignore index c7fcb9f..a9a38e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -SOURCES/iniparse-0.4.tar.gz -/iniparse-0.4.tar.gz +python-iniparse-0.5.tar.gz diff --git a/0001-Fix-tests-with-python-3.12.1.patch b/0001-Fix-tests-with-python-3.12.1.patch new file mode 100644 index 0000000..0b638b4 --- /dev/null +++ b/0001-Fix-tests-with-python-3.12.1.patch @@ -0,0 +1,29 @@ +From 033c0aa3e1a51cb70a97762252059e70cc2f671c Mon Sep 17 00:00:00 2001 +From: Daniel Garcia Moreno +Date: Wed, 20 Dec 2023 12:40:14 +0100 +Subject: [PATCH] Fix tests with python 3.11.7 + +--- +Backported to 0.5 (s/six/io/ below) + + tests/test_compat.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tests/test_compat.py b/tests/test_compat.py +index 8d7c785..86d0524 100644 +--- a/tests/test_compat.py ++++ b/tests/test_compat.py +@@ -1,3 +1,4 @@ ++import os + from iniparse import compat as ConfigParser + from six import StringIO + try: +@@ -263,6 +264,8 @@ class mystr(str): + + def test_read_returns_file_list(self): + file1 = test_support.findfile("cfgparser.1") ++ if not os.path.exists(file1): ++ file1 = test_support.findfile("configdata/cfgparser.1") + # check when we pass a mix of readable and non-readable files: + cf = self.newconfig() + parsed_files = cf.read([file1, "nonexistant-file"]) diff --git a/0006-Fix-compatibility-issues-with-Python-3.11.patch b/0006-Fix-compatibility-issues-with-Python-3.11.patch new file mode 100644 index 0000000..0ce51ba --- /dev/null +++ b/0006-Fix-compatibility-issues-with-Python-3.11.patch @@ -0,0 +1,96 @@ +From d9a083bafaa2df338a3176ee9f1433718b3a1090 Mon Sep 17 00:00:00 2001 +From: Jiri Hnidek +Date: Wed, 11 May 2022 14:29:27 +0200 +Subject: [PATCH 06/13] Fix compatibility issues with Python 3.11 + +* Fixes: https://github.com/candlepin/python-iniparse/issues/23 +* BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2019017 +* Replaced few deprecated methods with new methods +--- + tests/test_compat.py | 20 ++++++++++---------- + tests/test_fuzz.py | 2 +- + 2 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/tests/test_compat.py b/tests/test_compat.py +index ad36683..c8e6aca 100644 +--- a/tests/test_compat.py ++++ b/tests/test_compat.py +@@ -96,16 +96,16 @@ class TestCaseBase(unittest.TestCase): + eq(cf.get('Spaces', 'key with spaces'), 'value') + eq(cf.get('Spaces', 'another with spaces'), 'splat!') + +- self.failIf('__name__' in cf.options("Foo Bar"), ++ self.assertFalse('__name__' in cf.options("Foo Bar"), + '__name__ "option" should not be exposed by the API!') + + # Make sure the right things happen for remove_option(); + # added to include check for SourceForge bug #123324: +- self.failUnless(cf.remove_option('Foo Bar', 'foo'), ++ self.assertTrue(cf.remove_option('Foo Bar', 'foo'), + "remove_option() failed to report existance of option") +- self.failIf(cf.has_option('Foo Bar', 'foo'), ++ self.assertFalse(cf.has_option('Foo Bar', 'foo'), + "remove_option() failed to remove option") +- self.failIf(cf.remove_option('Foo Bar', 'foo'), ++ self.assertFalse(cf.remove_option('Foo Bar', 'foo'), + "remove_option() failed to report non-existance of option" + " that was removed") + +@@ -127,10 +127,10 @@ class TestCaseBase(unittest.TestCase): + eq(cf.options("a"), ["b"]) + eq(cf.get("a", "b"), "value", + "could not locate option, expecting case-insensitive option names") +- self.failUnless(cf.has_option("a", "b")) ++ self.assertTrue(cf.has_option("a", "b")) + cf.set("A", "A-B", "A-B value") + for opt in ("a-b", "A-b", "a-B", "A-B"): +- self.failUnless( ++ self.assertTrue( + cf.has_option("A", opt), + "has_option() returned false for option which should exist") + eq(cf.options("A"), ["a-b"]) +@@ -147,7 +147,7 @@ class TestCaseBase(unittest.TestCase): + # SF bug #561822: + cf = self.fromstring("[section]\nnekey=nevalue\n", + defaults={"key":"value"}) +- self.failUnless(cf.has_option("section", "Key")) ++ self.assertTrue(cf.has_option("section", "Key")) + + def test_default_case_sensitivity(self): + cf = self.newconfig({"foo": "Bar"}) +@@ -182,7 +182,7 @@ class TestCaseBase(unittest.TestCase): + cf = self.newconfig() + self.assertEqual(cf.sections(), [], + "new ConfigParser should have no defined sections") +- self.failIf(cf.has_section("Foo"), ++ self.assertFalse(cf.has_section("Foo"), + "new ConfigParser should have no acknowledged sections") + self.assertRaises(ConfigParser.NoSectionError, + cf.options, "Foo") +@@ -221,8 +221,8 @@ class TestCaseBase(unittest.TestCase): + "E5=FALSE AND MORE" + ) + for x in range(1, 5): +- self.failUnless(cf.getboolean('BOOLTEST', 't%d' % x)) +- self.failIf(cf.getboolean('BOOLTEST', 'f%d' % x)) ++ self.assertTrue(cf.getboolean('BOOLTEST', 't%d' % x)) ++ self.assertFalse(cf.getboolean('BOOLTEST', 'f%d' % x)) + self.assertRaises(ValueError, + cf.getboolean, 'BOOLTEST', 'e%d' % x) + +diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py +index df568bb..874ef2e 100644 +--- a/tests/test_fuzz.py ++++ b/tests/test_fuzz.py +@@ -102,7 +102,7 @@ class TestFuzz(unittest.TestCase): + cc = compat.RawConfigParser() + cc.readfp(StringIO(s)) + cc_py = configparser.RawConfigParser() +- cc_py.readfp(StringIO(s)) ++ cc_py.read_file(StringIO(s)) + # compare the two configparsers + self.assertEqualConfig(cc_py, cc) + # check that tidy does not change semantics +-- +2.41.0 + diff --git a/fix-issue-28.patch b/fix-issue-28.patch deleted file mode 100644 index ca6900a..0000000 --- a/fix-issue-28.patch +++ /dev/null @@ -1,27 +0,0 @@ -From b3d6ea5ed88b0e6cf9fdb411a14e725665ded92e Mon Sep 17 00:00:00 2001 -From: Tim Lauridsen -Date: Fri, 7 Mar 2014 19:06:40 +0100 -Subject: [PATCH] Fix handling of REM xxxxxxxx as a comment, but REMXXXX is not - (upstream issue #28) - ---- - tests/test_ini.py | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/tests/test_ini.py b/tests/test_ini.py -index 07d4f4e..6d974f0 100644 ---- a/tests/test_ini.py -+++ b/tests/test_ini.py -@@ -144,8 +144,7 @@ class test_comment_line(unittest.TestCase): - '#this is a comment', - ';; this is also a comment', - '; so is this ', -- 'Rem and this', -- 'remthis too!' -+ 'Rem and this' - ] - def test_parsing(self): - for l in self.lines: --- -1.8.5.3 - diff --git a/gating.yaml b/gating.yaml deleted file mode 100644 index 9e0ee4a..0000000 --- a/gating.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- !Policy -product_versions: - - rhel-8 -decision_context: osci_compose_gate -rules: - - !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1.functional} \ No newline at end of file diff --git a/python-iniparse-python3-compat.patch b/python-iniparse-python3-compat.patch deleted file mode 100644 index f7ce2ab..0000000 --- a/python-iniparse-python3-compat.patch +++ /dev/null @@ -1,523 +0,0 @@ -Index: iniparse/__init__.py -=================================================================== ---- iniparse/__init__.py (revision 146) -+++ iniparse/__init__.py (working copy) -@@ -3,17 +3,17 @@ - # Copyright (c) 2007 Tim Lauridsen - # All Rights Reserved. See LICENSE-PSF & LICENSE for details. - --from ini import INIConfig, change_comment_syntax --from config import BasicConfig, ConfigNamespace --from compat import RawConfigParser, ConfigParser, SafeConfigParser --from utils import tidy -+from .ini import INIConfig, change_comment_syntax -+from .config import BasicConfig, ConfigNamespace -+from .compat import RawConfigParser, ConfigParser, SafeConfigParser -+from .utils import tidy - --from ConfigParser import DuplicateSectionError, \ -- NoSectionError, NoOptionError, \ -- InterpolationMissingOptionError, \ -- InterpolationDepthError, \ -- InterpolationSyntaxError, \ -- DEFAULTSECT, MAX_INTERPOLATION_DEPTH -+from .configparser import DuplicateSectionError, \ -+ NoSectionError, NoOptionError, \ -+ InterpolationMissingOptionError, \ -+ InterpolationDepthError, \ -+ InterpolationSyntaxError, \ -+ DEFAULTSECT, MAX_INTERPOLATION_DEPTH - - __all__ = [ - 'BasicConfig', 'ConfigNamespace', -Index: iniparse/compat.py -=================================================================== ---- iniparse/compat.py (revision 146) -+++ iniparse/compat.py (working copy) -@@ -12,20 +12,22 @@ - """ - - import re --from ConfigParser import DuplicateSectionError, \ -- NoSectionError, NoOptionError, \ -- InterpolationMissingOptionError, \ -- InterpolationDepthError, \ -- InterpolationSyntaxError, \ -- DEFAULTSECT, MAX_INTERPOLATION_DEPTH -+from .configparser import DuplicateSectionError, \ -+ NoSectionError, NoOptionError, \ -+ InterpolationMissingOptionError, \ -+ InterpolationDepthError, \ -+ InterpolationSyntaxError, \ -+ DEFAULTSECT, MAX_INTERPOLATION_DEPTH - - # These are imported only for compatiability. - # The code below does not reference them directly. --from ConfigParser import Error, InterpolationError, \ -- MissingSectionHeaderError, ParsingError -+from .configparser import Error, InterpolationError, \ -+ MissingSectionHeaderError, ParsingError - --import ini -+import six - -+from . import ini -+ - class RawConfigParser(object): - def __init__(self, defaults=None, dict_type=dict): - if dict_type != dict: -@@ -56,7 +58,7 @@ - # The default section is the only one that gets the case-insensitive - # treatment - so it is special-cased here. - if section.lower() == "default": -- raise ValueError, 'Invalid section name: %s' % section -+ raise ValueError('Invalid section name: %s' % section) - - if self.has_section(section): - raise DuplicateSectionError(section) -@@ -88,7 +90,7 @@ - filename may also be given. - """ - files_read = [] -- if isinstance(filenames, basestring): -+ if isinstance(filenames, six.string_types): - filenames = [filenames] - for filename in filenames: - try: -@@ -143,7 +145,7 @@ - def getboolean(self, section, option): - v = self.get(section, option) - if v.lower() not in self._boolean_states: -- raise ValueError, 'Not a boolean: %s' % v -+ raise ValueError('Not a boolean: %s' % v) - return self._boolean_states[v.lower()] - - def has_option(self, section, option): -@@ -234,7 +236,7 @@ - if "%(" in value: - try: - value = value % vars -- except KeyError, e: -+ except KeyError as e: - raise InterpolationMissingOptionError( - option, section, rawval, e.args[0]) - else: -@@ -283,7 +285,7 @@ - _badpercent_re = re.compile(r"%[^%]|%$") - - def set(self, section, option, value): -- if not isinstance(value, basestring): -+ if not isinstance(value, six.string_types): - raise TypeError("option values must be strings") - # check for bad percent signs: - # first, replace all "good" interpolations -Index: iniparse/config.py -=================================================================== ---- iniparse/config.py (revision 146) -+++ iniparse/config.py (working copy) -@@ -143,7 +143,7 @@ - - >>> n.aaa = 42 - >>> del n.x -- >>> print n -+ >>> print(n) - aaa = 42 - name.first = paramjit - name.last = oberoi -@@ -152,7 +152,7 @@ - - >>> isinstance(n.name, ConfigNamespace) - True -- >>> print n.name -+ >>> print(n.name) - first = paramjit - last = oberoi - >>> sorted(list(n.name)) -@@ -160,7 +160,7 @@ - - Finally, values can be read from a file as follows: - -- >>> from StringIO import StringIO -+ >>> from six import StringIO - >>> sio = StringIO(''' - ... # comment - ... ui.height = 100 -@@ -171,7 +171,7 @@ - ... ''') - >>> n = BasicConfig() - >>> n._readfp(sio) -- >>> print n -+ >>> print(n) - complexity = medium - data.secret.password = goodness=gracious me - have_python -@@ -199,7 +199,7 @@ - - def __str__(self, prefix=''): - lines = [] -- keys = self._data.keys() -+ keys = list(self._data.keys()) - keys.sort() - for name in keys: - value = self._data[name] -@@ -258,7 +258,7 @@ - >>> n.ui.display_clock = True - >>> n.ui.display_qlength = True - >>> n.ui.width = 150 -- >>> print n -+ >>> print(n) - playlist.expand_playlist = True - ui.display_clock = True - ui.display_qlength = True -@@ -267,7 +267,7 @@ - >>> from iniparse import ini - >>> i = ini.INIConfig() - >>> update_config(i, n) -- >>> print i -+ >>> print(i) - [playlist] - expand_playlist = True - -@@ -277,7 +277,7 @@ - width = 150 - - """ -- for name in source: -+ for name in sorted(source): - value = source[name] - if isinstance(value, ConfigNamespace): - if name in target: -Index: iniparse/configparser.py -=================================================================== ---- iniparse/configparser.py (revision 0) -+++ iniparse/configparser.py (working copy) -@@ -0,0 +1,7 @@ -+try: -+ from ConfigParser import * -+ # not all objects get imported with __all__ -+ from ConfigParser import Error, InterpolationMissingOptionError -+except ImportError: -+ from configparser import * -+ from configparser import Error, InterpolationMissingOptionError -Index: iniparse/ini.py -=================================================================== ---- iniparse/ini.py (revision 146) -+++ iniparse/ini.py (working copy) -@@ -7,7 +7,7 @@ - - Example: - -- >>> from StringIO import StringIO -+ >>> from six import StringIO - >>> sio = StringIO('''# configure foo-application - ... [foo] - ... bar1 = qualia -@@ -16,14 +16,14 @@ - ... special = 1''') - - >>> cfg = INIConfig(sio) -- >>> print cfg.foo.bar1 -+ >>> print(cfg.foo.bar1) - qualia -- >>> print cfg['foo-ext'].special -+ >>> print(cfg['foo-ext'].special) - 1 - >>> cfg.foo.newopt = 'hi!' - >>> cfg.baz.enabled = 0 - -- >>> print cfg -+ >>> print(cfg) - # configure foo-application - [foo] - bar1 = qualia -@@ -42,10 +42,12 @@ - # Backward-compatiable with ConfigParser - - import re --from ConfigParser import DEFAULTSECT, ParsingError, MissingSectionHeaderError -+from .configparser import DEFAULTSECT, ParsingError, MissingSectionHeaderError - --import config -+import six - -+from . import config -+ - class LineType(object): - line = None - -@@ -278,6 +280,8 @@ - value = property(get_value, set_value) - - def __str__(self): -+ for c in self.contents: -+ pass#print(c.__str__()) - s = [x.__str__() for x in self.contents] - return '\n'.join(s) - -@@ -465,7 +469,7 @@ - self._sections = {} - if defaults is None: defaults = {} - self._defaults = INISection(LineContainer(), optionxformsource=self) -- for name, value in defaults.iteritems(): -+ for name, value in defaults.items(): - self._defaults[name] = value - if fp is not None: - self._readfp(fp) -@@ -551,7 +555,7 @@ - - for line in readline_iterator(fp): - # Check for BOM on first line -- if linecount == 0 and isinstance(line, unicode): -+ if linecount == 0 and isinstance(line, six.text_type): - if line[0] == u'\ufeff': - line = line[1:] - self._bom = True -Index: iniparse/utils.py -=================================================================== ---- iniparse/utils.py (revision 146) -+++ iniparse/utils.py (working copy) -@@ -1,5 +1,5 @@ --import compat --from ini import LineContainer, EmptyLine -+from . import compat -+from .ini import LineContainer, EmptyLine - - def tidy(cfg): - """Clean up blank lines. -Index: tests/__init__.py -=================================================================== ---- tests/__init__.py (revision 146) -+++ tests/__init__.py (working copy) -@@ -1,12 +1,12 @@ - import unittest, doctest - --import test_ini --import test_misc --import test_fuzz --import test_compat --import test_unicode --import test_tidy --import test_multiprocessing -+from . import test_ini -+from . import test_misc -+from . import test_fuzz -+from . import test_compat -+from . import test_unicode -+from . import test_tidy -+from . import test_multiprocessing - from iniparse import config - from iniparse import ini - -Index: tests/test_compat.py -=================================================================== ---- tests/test_compat.py (revision 146) -+++ tests/test_compat.py (working copy) -@@ -1,9 +1,16 @@ - from iniparse import compat as ConfigParser --import StringIO -+from six import StringIO -+try: -+ import UserDict -+except ImportError: -+ import collections as UserDict - import unittest --import UserDict - --from test import test_support -+import sys -+if sys.version_info[0] < 3: -+ from test import test_support -+else: -+ from test import support as test_support - - class SortedDict(UserDict.UserDict): - def items(self): -@@ -35,7 +42,7 @@ - - def fromstring(self, string, defaults=None): - cf = self.newconfig(defaults) -- sio = StringIO.StringIO(string) -+ sio = StringIO(string) - cf.readfp(sio) - return cf - -@@ -161,7 +168,7 @@ - "No Section!\n") - - def parse_error(self, exc, src): -- sio = StringIO.StringIO(src) -+ sio = StringIO(src) - self.assertRaises(exc, self.cf.readfp, sio) - - def test_query_errors(self): -@@ -181,7 +188,7 @@ - def get_error(self, exc, section, option): - try: - self.cf.get(section, option) -- except exc, e: -+ except exc as e: - return e - else: - self.fail("expected exception type %s.%s" -@@ -227,7 +234,7 @@ - "foo: another very\n" - " long line" - ) -- output = StringIO.StringIO() -+ output = StringIO() - cf.write(output) - self.assertEqual( - output.getvalue(), -@@ -465,7 +472,7 @@ - "o1=4\n" - "[a]\n" - "k=v\n") -- output = StringIO.StringIO() -+ output = StringIO() - self.cf.write(output) - self.assertEquals(output.getvalue(), - "[a]\n" -Index: tests/test_fuzz.py -=================================================================== ---- tests/test_fuzz.py (revision 146) -+++ tests/test_fuzz.py (working copy) -@@ -1,9 +1,10 @@ - import re - import os - import random -+import sys - import unittest --import ConfigParser --from StringIO import StringIO -+from six import StringIO -+from six.moves import configparser - from iniparse import compat, ini, tidy - - # TODO: -@@ -96,24 +97,25 @@ - s = '\n'.join(good_lines) - cc = compat.RawConfigParser() - cc.readfp(StringIO(s)) -- cc_py = ConfigParser.RawConfigParser() -+ cc_py = configparser.RawConfigParser() - cc_py.readfp(StringIO(s)) - # compare the two configparsers - self.assertEqualConfig(cc_py, cc) - # check that tidy does not change semantics - tidy(cc) -- cc_tidy = ConfigParser.RawConfigParser() -+ cc_tidy = configparser.RawConfigParser() - cc_tidy.readfp(StringIO(str(cc.data))) - self.assertEqualConfig(cc_py, cc_tidy) - except AssertionError: - fname = 'fuzz-test-iter-%d.ini' % fuzz_iter -- print 'Fuzz test failed at iteration', fuzz_iter -- print 'Writing out failing INI file as', fname -+ print('Fuzz test failed at iteration', fuzz_iter) -+ print('Writing out failing INI file as', fname) - f = open(fname, 'w') - f.write(s) - f.close() - raise - -+ @unittest.skipIf(sys.version_info[0] > 2, 'http://code.google.com/p/iniparse/issues/detail?id=22#c9') - def assertEqualConfig(self, c1, c2): - self.assertEqualSorted(c1.sections(), c2.sections()) - self.assertEqualSorted(c1.defaults().items(), c2.defaults().items()) -@@ -123,9 +125,7 @@ - self.assertEqual(c1.get(sec, opt), c2.get(sec, opt)) - - def assertEqualSorted(self, l1, l2): -- l1.sort() -- l2.sort() -- self.assertEqual(l1, l2) -+ self.assertEqual(sorted(l1), sorted(l2)) - - class suite(unittest.TestSuite): - def __init__(self): -Index: tests/test_ini.py -=================================================================== ---- tests/test_ini.py (revision 146) -+++ tests/test_ini.py (working copy) -@@ -1,5 +1,5 @@ - import unittest --from StringIO import StringIO -+from six import StringIO - - from iniparse import ini - from iniparse import compat -@@ -196,13 +196,13 @@ - self.assertEqual(p._data.find('section2').find('just').value, 'kidding') - - itr = p._data.finditer('section1') -- v = itr.next() -+ v = next(itr) - self.assertEqual(v.find('help').value, 'yourself') - self.assertEqual(v.find('but').value, 'also me') -- v = itr.next() -+ v = next(itr) - self.assertEqual(v.find('help').value, 'me') - self.assertEqual(v.find('I\'m').value, 'desperate') -- self.assertRaises(StopIteration, itr.next) -+ self.assertRaises(StopIteration, next, itr) - - self.assertRaises(KeyError, p._data.find, 'section') - self.assertRaises(KeyError, p._data.find('section2').find, 'ahem') -Index: tests/test_misc.py -=================================================================== ---- tests/test_misc.py (revision 146) -+++ tests/test_misc.py (working copy) -@@ -1,9 +1,9 @@ - import re - import unittest - import pickle --import ConfigParser -+from six.moves import configparser -+from six import StringIO - from textwrap import dedent --from StringIO import StringIO - from iniparse import compat, ini - - class CaseSensitiveConfigParser(compat.ConfigParser): -Index: tests/test_tidy.py -=================================================================== ---- tests/test_tidy.py (revision 146) -+++ tests/test_tidy.py (working copy) -@@ -1,6 +1,6 @@ - import unittest - from textwrap import dedent --from StringIO import StringIO -+from six import StringIO - - from iniparse import tidy,INIConfig - from iniparse.ini import EmptyLine -Index: tests/test_unicode.py -=================================================================== ---- tests/test_unicode.py (revision 146) -+++ tests/test_unicode.py (working copy) -@@ -1,5 +1,5 @@ - import unittest --from StringIO import StringIO -+import six - from iniparse import compat, ini - - class test_unicode(unittest.TestCase): -@@ -17,14 +17,14 @@ - """ - - def basic_tests(self, s, strable): -- f = StringIO(s) -+ f = six.StringIO(s) - i = ini.INIConfig(f) -- self.assertEqual(unicode(i), s) -- self.assertEqual(type(i.foo.bar), unicode) -+ self.assertEqual(six.text_type(i), s) -+ self.assertEqual(type(i.foo.bar), six.text_type) - if strable: - self.assertEqual(str(i), str(s)) - else: -- self.assertRaises(UnicodeEncodeError, lambda: str(i)) -+ self.assertRaises(UnicodeEncodeError, lambda: six.text_type(i).encode('ascii')) - return i - - def test_ascii(self): diff --git a/python-iniparse-setup-fixes.patch b/python-iniparse-setup-fixes.patch deleted file mode 100644 index 8e1c093..0000000 --- a/python-iniparse-setup-fixes.patch +++ /dev/null @@ -1,48 +0,0 @@ -diff --git a/PKG-INFO b/PKG-INFO -index 31c4ad2..bebcb80 100644 ---- PKG-INFO -+++ PKG-INFO -@@ -18,7 +18,10 @@ Classifier: License :: OSI Approved :: MIT License - Classifier: License :: OSI Approved :: Python Software Foundation License - Classifier: Operating System :: OS Independent - Classifier: Programming Language :: Python --Classifier: Programming Language :: Python :: 2.4 --Classifier: Programming Language :: Python :: 2.5 -+Classifier: Programming Language :: Python :: 2 - Classifier: Programming Language :: Python :: 2.6 -+Classifier: Programming Language :: Python :: 2.7 -+Classifier: Programming Language :: Python :: 3 -+Classifier: Programming Language :: Python :: 3.3 -+Classifier: Programming Language :: Python :: 3.4 - Classifier: Topic :: Software Development :: Libraries :: Python Modules -diff --git a/setup.py b/setup.py -index 736cfa1..e2f8de0 100644 ---- setup.py -+++ setup.py -@@ -1,6 +1,6 @@ - #!/usr/bin/env python - --from distutils.core import setup -+from setuptools import setup - - VERSION = '0.4' - -@@ -24,12 +24,16 @@ use.''', - 'License :: OSI Approved :: Python Software Foundation License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', -- 'Programming Language :: Python :: 2.4', -- 'Programming Language :: Python :: 2.5', -+ 'Programming Language :: Python :: 2' - 'Programming Language :: Python :: 2.6', -+ 'Programming Language :: Python :: 2.7', -+ 'Programming Language :: Python :: 3', -+ 'Programming Language :: Python :: 3.3', -+ 'Programming Language :: Python :: 3.4' - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - packages = ['iniparse'], -+ install_requires=['six'], - data_files = [ - ('share/doc/iniparse-%s' % VERSION, ['README', 'LICENSE-PSF', - 'LICENSE', 'Changelog', diff --git a/python-iniparse.spec b/python-iniparse.spec index 391c69d..3b898ce 100644 --- a/python-iniparse.spec +++ b/python-iniparse.spec @@ -1,73 +1,151 @@ -%global modname iniparse - # Use the same directory of the main package for subpackage licence and docs %global _docdir_fmt %{name} -Name: python-%{modname} -Version: 0.4 -Release: 31%{?dist} -Summary: Python Module for Accessing and Modifying Configuration Data in INI files +Name: python-iniparse +Version: 0.5 +Release: 10%{?dist} +Summary: Accessing and Modifying INI files + +# From LICENSE: +# iniparse/compat.py and tests/test_compat.py contain code derived from +# lib/python-2.3/ConfigParser.py and lib/python-2.3/test/test_cfgparse.py +# respectively. Other code may contain small snippets from those two files +# as well. The Python license (LICENSE-PSF) applies to that code. License: MIT and Python -URL: http://code.google.com/p/iniparse/ -Source0: http://iniparse.googlecode.com/files/%{modname}-%{version}.tar.gz -Patch0: fix-issue-28.patch -# The patch upstream (http://code.google.com/p/iniparse/issues/detail?id=22) -# is Python3-only. The patch below uses python-six to create a version that works -# with both Python major versions and is more error-prone. -Patch1: %{name}-python3-compat.patch -# Fixup the module to have proper setup.py information -Patch2: %{name}-setup-fixes.patch +URL: https://github.com/candlepin/python-iniparse +Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +# https://github.com/candlepin/python-iniparse/pull/24 +Patch6: 0006-Fix-compatibility-issues-with-Python-3.11.patch +# https://github.com/candlepin/python-iniparse/pull/29 +Patch7: 0001-Fix-tests-with-python-3.12.1.patch BuildArch: noarch -%global _description \ -iniparse is an INI parser for Python which is API compatible\ -with the standard library's ConfigParser, preserves structure of INI\ -files (order of sections & options, indentation, comments, and blank\ -lines are preserved when data is updated), and is more convenient to\ -use. - -%description %{_description} - -%package -n python3-%{modname} -Summary: %{summary} -%{?python_provide:%python_provide python3-%{modname}} BuildRequires: python3-devel -BuildRequires: python3-setuptools -BuildRequires: python3-six BuildRequires: python3-test -Requires: python3-six -Obsoletes: platform-python-%{modname} < %{version}-%{release} -%description -n python3-%{modname} %{_description} +%global _description %{expand: \ +iniparse is an INI parser for Python which is API compatible with the standard +library’s ConfigParser, preserves structure of INI files (order of sections & +options, indentation, comments, and blank lines are preserved when data is +updated), and is more convenient to use.} + +%description +%{_description} + +%package -n python3-iniparse +Summary: %{summary} + +%description -n python3-iniparse +%{_description} %prep -%setup -q -n %{modname}-%{version} -%patch0 -p1 -%patch1 -p0 -%patch2 -p0 +%autosetup -p1 chmod -c -x html/index.html +%generate_buildrequires +%pyproject_buildrequires + %build -%py3_build +%pyproject_wheel %install -%py3_install +%pyproject_install rm -vfr %{buildroot}%{_docdir}/* +%pyproject_save_files iniparse %check -%{__python3} runtests.py +%{py3_test_envvars} %{python3} ./runtests.py -%files -n python3-%{modname} -%license LICENSE LICENSE-PSF -%doc README Changelog html/ -%{python3_sitelib}/%{modname}/ -%{python3_sitelib}/%{modname}-%{version}-*.egg-info +%files -n python3-iniparse -f %{pyproject_files} +# pyproject_files handles both license files; verify with “rpm -qL -p …” +%doc README.md Changelog html/ %changelog -* Thu May 31 2018 Petr Viktorin - 0.4-31 -- Remove Python 2 subpackage - https://bugzilla.redhat.com/show_bug.cgi?id=1567873 +* Tue Oct 29 2024 Troy Dawson - 0.5-10 +- Bump release for October 2024 mass rebuild: + Resolves: RHEL-64018 + +* Mon Jun 24 2024 Troy Dawson - 0.5-9 +- Bump release for June 2024 mass rebuild + +* Fri Jan 26 2024 Fedora Release Engineering - 0.5-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Jan 22 2024 Fedora Release Engineering - 0.5-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Fri Jul 21 2023 Fedora Release Engineering - 0.5-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Wed Jun 14 2023 Python Maint - 0.5-5 +- Rebuilt for Python 3.12 +- Fixes: rhbz#2176142 + +* Fri Jan 20 2023 Fedora Release Engineering - 0.5-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Fri Jul 22 2022 Fedora Release Engineering - 0.5-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Mon Jun 13 2022 Benjamin A. Beasley - 0.5-2 +- Port to pyproject-rpm-macros +- Mention license breakdown in a spec file comment +- Update summary and description from upstream + +* Mon Jun 13 2022 Jiri Hnidek - 0.5-1 +- Release 0.5 +- Moved project to https://github.com/candlepin/python-iniparse +- Added support for Python 3 to upstream project + +* Mon Jun 13 2022 Python Maint - 0.4-47 +- Rebuilt for Python 3.11 + +* Fri Jan 21 2022 Fedora Release Engineering - 0.4-46 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Fri Jul 23 2021 Fedora Release Engineering - 0.4-45 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Wed Jun 02 2021 Python Maint - 0.4-44 +- Rebuilt for Python 3.10 + +* Wed Jan 27 2021 Fedora Release Engineering - 0.4-43 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Jul 29 2020 Fedora Release Engineering - 0.4-42 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Fri May 22 2020 Miro Hrončok - 0.4-41 +- Rebuilt for Python 3.9 + +* Thu Jan 30 2020 Fedora Release Engineering - 0.4-40 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Mon Nov 18 2019 Miro Hrončok - 0.4-39 +- Subpackage python2-iniparse has been removed + See https://fedoraproject.org/wiki/Changes/RetirePython2 + +* Thu Oct 03 2019 Miro Hrončok - 0.4-38 +- Rebuilt for Python 3.8.0rc1 (#1748018) + +* Sat Aug 31 2019 Miro Hrončok - 0.4-37 +- Drop build dependency on python2-test + +* Wed Aug 14 2019 Miro Hrončok - 0.4-36 +- Rebuilt for Python 3.8 + +* Fri Jul 26 2019 Fedora Release Engineering - 0.4-34 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Sat Feb 02 2019 Fedora Release Engineering - 0.4-33 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Sat Jul 14 2018 Fedora Release Engineering - 0.4-32 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Jun 13 2018 Miro Hrončok - 0.4-31 +- Rebuilt for Python 3.7 * Fri Feb 09 2018 Fedora Release Engineering - 0.4-30 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild diff --git a/sources b/sources index fa854c9..508d73c 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (iniparse-0.4.tar.gz) = d59eae7c1ce474c89eddb0b0cbff5973444571728aa0c6ce5b3632984353415f7eec4de63cf007c276df0d1bb914b2ea5dd0acc00f3a261285c8e2e9883fbe9a +SHA512 (python-iniparse-0.5.tar.gz) = 300be4b2545fb6c98b0e20c64afee09859390ef95e4b83070e9119491eb1d7c4f8920c2fe80d863ca291a4b5c9e643f87aae39d7b2172ea85dff9322644ebd3e