Hello community, here is the log from the commit of package python-iniparse for openSUSE:Factory checked in at 2017-06-13 16:06:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-iniparse (Old) and /work/SRC/openSUSE:Factory/.python-iniparse.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-iniparse" Tue Jun 13 16:06:39 2017 rev:19 rq:501425 version:0.4 Changes: -------- --- /work/SRC/openSUSE:Factory/python-iniparse/python-iniparse.changes 2013-10-25 11:19:13.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-iniparse.new/python-iniparse.changes 2017-06-13 16:06:44.710178370 +0200 @@ -1,0 +2,9 @@ +Tue Jun 6 13:38:02 UTC 2017 - [email protected] + +- Add patches from Fedora to enable Python 3 support + * iniparse-fix-issue-28.patch + * python-iniparse-python3-compat.patch + * python-iniparse-setup-fixes.patch +- Convert to singlespec to offer Python 3 variant + +------------------------------------------------------------------- New: ---- iniparse-fix-issue-28.patch python-iniparse-python3-compat.patch python-iniparse-setup-fixes.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-iniparse.spec ++++++ --- /var/tmp/diff_new_pack.k46K0b/_old 2017-06-13 16:06:45.334090443 +0200 +++ /var/tmp/diff_new_pack.k46K0b/_new 2017-06-13 16:06:45.338089879 +0200 @@ -1,7 +1,8 @@ # # spec file for package python-iniparse # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 Neal Gompa <[email protected]>. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,6 +17,7 @@ # +%{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-iniparse Version: 0.4 Release: 0 @@ -26,14 +28,24 @@ Source: http://iniparse.googlecode.com/files/iniparse-%{version}.tar.gz # PATCH-FIX-UPSTREAM: [email protected] -- Backport of https://code.google.com/p/iniparse/issues/detail?id=31 Patch0: iniparse-insert-after-commented-option.patch +# PATCH-FIX-UPSTREAM: [email protected] -- Backport of https://code.google.com/p/iniparse/issues/detail?id=28 +Patch1: iniparse-fix-issue-28.patch +# PATCH-FIX-OPENSUSE: [email protected] -- Variant of http://code.google.com/p/iniparse/issues/detail?id=22 that uses python-six to support py2+py3, from Fedora +Patch2: python-iniparse-python3-compat.patch +# PATCH-FIX-OPENSUSE: [email protected] -- Fix setup.py to have correct information, from Fedora +Patch3: python-iniparse-setup-fixes.patch + +BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module six} BuildRequires: python-devel -BuildRequires: python-setuptools +BuildRequires: python-rpm-macros +BuildRequires: python3-devel +# tests require testsuite modules +BuildRequires: python3-testsuite BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if 0%{?suse_version} && 0%{?suse_version} <= 1110 -%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} -%else BuildArch: noarch -%endif + +%python_subpackages %description iniparse is an INI parser for Python which is API compatible with the @@ -44,20 +56,24 @@ %prep %setup -q -n iniparse-%{version} %patch0 -p0 +%patch1 -p1 +%patch2 -p0 +%patch3 -p0 + chmod 644 html/index.html sed -i "/.*test_multiprocessing.*/d" tests/__init__.py # NOTE(saschpe): Doesn't work and I'm lazy %build -python setup.py build +%python_build %install -python setup.py install --root %{buildroot} --prefix=%{_prefix} +%python_install rm -rf %{buildroot}%{_datadir}/doc/iniparse-%{version} # Remove unwanted stuff %check -python runtests.py +%python_exec runtests.py -%files +%files %{python_files} %defattr(-,root,root,-) %doc Changelog LICENSE LICENSE-PSF README html/* %{python_sitelib}/* ++++++ iniparse-fix-issue-28.patch ++++++ >From b3d6ea5ed88b0e6cf9fdb411a14e725665ded92e Mon Sep 17 00:00:00 2001 From: Tim Lauridsen <[email protected]> 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 ++++++ python-iniparse-python3-compat.patch ++++++ Index: iniparse/__init__.py =================================================================== --- iniparse/__init__.py (revision 146) +++ iniparse/__init__.py (working copy) @@ -3,17 +3,17 @@ # Copyright (c) 2007 Tim Lauridsen <[email protected]> # 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): ++++++ python-iniparse-setup-fixes.patch ++++++ 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',
