diff --git a/.gitignore b/.gitignore index 7959e80..8bd52c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -iniparse-0.4.tar.gz +/python-iniparse-*.tar.gz 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/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 ef89f60..9f91c49 100644 --- a/python-iniparse.spec +++ b/python-iniparse.spec @@ -4,19 +4,12 @@ %global _docdir_fmt %{name} Name: python-%{modname} -Version: 0.4 -Release: 47%{?dist} +Version: 0.5 +Release: 1%{?dist} Summary: Python Module for Accessing and Modifying Configuration Data in INI files 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: https://github.com/candlepin/python-iniparse/archive/%{version}/%{name}-%{version}.tar.gz BuildArch: noarch @@ -42,10 +35,7 @@ BuildRequires: python3-test Python 3 version. %prep -%setup -q -n %{modname}-%{version} -%patch0 -p1 -%patch1 -p0 -%patch2 -p0 +%autosetup -p1 chmod -c -x html/index.html %build @@ -60,11 +50,16 @@ rm -vfr %{buildroot}%{_docdir}/* %files -n python3-%{modname} %license LICENSE LICENSE-PSF -%doc README Changelog html/ +%doc README.md Changelog html/ %{python3_sitelib}/%{modname}/ %{python3_sitelib}/%{modname}-%{version}-*.egg-info/ %changelog +* 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 diff --git a/sources b/sources index 7bfe791..508d73c 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -5e573e9e9733d97623881ce9bbe5eca6 iniparse-0.4.tar.gz +SHA512 (python-iniparse-0.5.tar.gz) = 300be4b2545fb6c98b0e20c64afee09859390ef95e4b83070e9119491eb1d7c4f8920c2fe80d863ca291a4b5c9e643f87aae39d7b2172ea85dff9322644ebd3e