Compare commits
No commits in common. "c8s" and "c10s" have entirely different histories.
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1 @@
|
||||
SOURCES/iniparse-0.4.tar.gz
|
||||
/iniparse-0.4.tar.gz
|
||||
/python-iniparse-*.tar.gz
|
||||
|
29
0001-Fix-tests-with-python-3.12.1.patch
Normal file
29
0001-Fix-tests-with-python-3.12.1.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 033c0aa3e1a51cb70a97762252059e70cc2f671c Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Garcia Moreno <daniel.garcia@suse.com>
|
||||
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"])
|
96
0006-Fix-compatibility-issues-with-Python-3.11.patch
Normal file
96
0006-Fix-compatibility-issues-with-Python-3.11.patch
Normal file
@ -0,0 +1,96 @@
|
||||
From d9a083bafaa2df338a3176ee9f1433718b3a1090 Mon Sep 17 00:00:00 2001
|
||||
From: Jiri Hnidek <jhnidek@redhat.com>
|
||||
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
|
||||
|
@ -1,27 +0,0 @@
|
||||
From b3d6ea5ed88b0e6cf9fdb411a14e725665ded92e Mon Sep 17 00:00:00 2001
|
||||
From: Tim Lauridsen <timlau@fedoraproject.org>
|
||||
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
|
||||
|
@ -1,6 +1,4 @@
|
||||
--- !Policy
|
||||
product_versions:
|
||||
- rhel-8
|
||||
- rhel-10
|
||||
decision_context: osci_compose_gate
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1.functional}
|
@ -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 <tla@rasmil.dk>
|
||||
# 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
|
||||
<BLANKLINE>
|
||||
@@ -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):
|
@ -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',
|
@ -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 <pviktori@redhat.com> - 0.4-31
|
||||
- Remove Python 2 subpackage
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1567873
|
||||
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 0.5-10
|
||||
- Bump release for October 2024 mass rebuild:
|
||||
Resolves: RHEL-64018
|
||||
|
||||
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 0.5-9
|
||||
- Bump release for June 2024 mass rebuild
|
||||
|
||||
* Fri Jan 26 2024 Fedora Release Engineering <releng@fedoraproject.org> - 0.5-8
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Mon Jan 22 2024 Fedora Release Engineering <releng@fedoraproject.org> - 0.5-7
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 0.5-6
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||
|
||||
* Wed Jun 14 2023 Python Maint <python-maint@redhat.com> - 0.5-5
|
||||
- Rebuilt for Python 3.12
|
||||
- Fixes: rhbz#2176142
|
||||
|
||||
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 0.5-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||
|
||||
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 0.5-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||
|
||||
* Mon Jun 13 2022 Benjamin A. Beasley <code@musicinmybrain.net> - 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 <jhnidek@redhat.com> - 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 <python-maint@redhat.com> - 0.4-47
|
||||
- Rebuilt for Python 3.11
|
||||
|
||||
* Fri Jan 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-46
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||
|
||||
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-45
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||
|
||||
* Wed Jun 02 2021 Python Maint <python-maint@redhat.com> - 0.4-44
|
||||
- Rebuilt for Python 3.10
|
||||
|
||||
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-43
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||
|
||||
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-42
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||
|
||||
* Fri May 22 2020 Miro Hrončok <mhroncok@redhat.com> - 0.4-41
|
||||
- Rebuilt for Python 3.9
|
||||
|
||||
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-40
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||
|
||||
* Mon Nov 18 2019 Miro Hrončok <mhroncok@redhat.com> - 0.4-39
|
||||
- Subpackage python2-iniparse has been removed
|
||||
See https://fedoraproject.org/wiki/Changes/RetirePython2
|
||||
|
||||
* Thu Oct 03 2019 Miro Hrončok <mhroncok@redhat.com> - 0.4-38
|
||||
- Rebuilt for Python 3.8.0rc1 (#1748018)
|
||||
|
||||
* Sat Aug 31 2019 Miro Hrončok <mhroncok@redhat.com> - 0.4-37
|
||||
- Drop build dependency on python2-test
|
||||
|
||||
* Wed Aug 14 2019 Miro Hrončok <mhroncok@redhat.com> - 0.4-36
|
||||
- Rebuilt for Python 3.8
|
||||
|
||||
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-34
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||
|
||||
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-33
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||
|
||||
* Sat Jul 14 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-32
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||
|
||||
* Wed Jun 13 2018 Miro Hrončok <mhroncok@redhat.com> - 0.4-31
|
||||
- Rebuilt for Python 3.7
|
||||
|
||||
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-30
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (iniparse-0.4.tar.gz) = d59eae7c1ce474c89eddb0b0cbff5973444571728aa0c6ce5b3632984353415f7eec4de63cf007c276df0d1bb914b2ea5dd0acc00f3a261285c8e2e9883fbe9a
|
||||
SHA512 (python-iniparse-0.5.tar.gz) = 300be4b2545fb6c98b0e20c64afee09859390ef95e4b83070e9119491eb1d7c4f8920c2fe80d863ca291a4b5c9e643f87aae39d7b2172ea85dff9322644ebd3e
|
||||
|
Loading…
Reference in New Issue
Block a user