Browse code

python-iniparse: Fix python3 and make check issues. (Bug 1906265)

Change-Id: I305bace7e0bbde2a437db2eb19e4c2009cfa6ff0
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/3231
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Divya Thaluru <dthaluru@vmware.com>

xiaolin-vmware authored on 2017/07/13 07:30:34
Showing 4 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,552 @@
0
+From 8a98e4d44a5e59439a4b6bd95368cc362412c995 Mon Sep 17 00:00:00 2001
1
+From: Alexander Kanavin <alex.kanavin@gmail.com>
2
+Date: Fri, 24 Mar 2017 18:06:08 +0200
3
+Subject: [PATCH] Add python 3 compatibility.
4
+
5
+Taken from
6
+http://pkgs.fedoraproject.org/cgit/rpms/python-iniparse.git/tree/python-iniparse-python3-compat.patch
7
+
8
+Upstream-Status: Inappropriate [upstream is defunct]
9
+Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
10
+---
11
+ iniparse/__init__.py     | 20 ++++++++++----------
12
+ iniparse/compat.py       | 30 ++++++++++++++++--------------
13
+ iniparse/config.py       | 16 ++++++++--------
14
+ iniparse/configparser.py |  7 +++++++
15
+ iniparse/ini.py          | 20 ++++++++++++--------
16
+ iniparse/utils.py        |  4 ++--
17
+ tests/__init__.py        | 14 +++++++-------
18
+ tests/test_compat.py     | 23 +++++++++++++++--------
19
+ tests/test_fuzz.py       | 18 +++++++++---------
20
+ tests/test_ini.py        |  8 ++++----
21
+ tests/test_misc.py       |  4 ++--
22
+ tests/test_tidy.py       |  2 +-
23
+ tests/test_unicode.py    | 10 +++++-----
24
+ 13 files changed, 98 insertions(+), 78 deletions(-)
25
+ create mode 100644 iniparse/configparser.py
26
+
27
+diff --git a/iniparse/__init__.py b/iniparse/__init__.py
28
+index 8de756f..7193f92 100644
29
+--- a/iniparse/__init__.py
30
+@@ -3,17 +3,17 @@
31
+ # Copyright (c) 2007 Tim Lauridsen <tla@rasmil.dk>
32
+ # All Rights Reserved.  See LICENSE-PSF & LICENSE for details.
33
+ 
34
+-from ini import INIConfig, change_comment_syntax
35
+-from config import BasicConfig, ConfigNamespace
36
+-from compat import RawConfigParser, ConfigParser, SafeConfigParser
37
+-from utils import tidy
38
++from .ini import INIConfig, change_comment_syntax
39
++from .config import BasicConfig, ConfigNamespace
40
++from .compat import RawConfigParser, ConfigParser, SafeConfigParser
41
++from .utils import tidy
42
+ 
43
+-from ConfigParser import DuplicateSectionError,    \
44
+-                  NoSectionError, NoOptionError,   \
45
+-                  InterpolationMissingOptionError, \
46
+-                  InterpolationDepthError,         \
47
+-                  InterpolationSyntaxError,        \
48
+-                  DEFAULTSECT, MAX_INTERPOLATION_DEPTH
49
++from .configparser import DuplicateSectionError,    \
50
++                   NoSectionError, NoOptionError,   \
51
++                   InterpolationMissingOptionError, \
52
++                   InterpolationDepthError,         \
53
++                   InterpolationSyntaxError,        \
54
++                   DEFAULTSECT, MAX_INTERPOLATION_DEPTH
55
+ 
56
+ __all__ = [
57
+     'BasicConfig', 'ConfigNamespace',
58
+diff --git a/iniparse/compat.py b/iniparse/compat.py
59
+index db89ed8..f95c25c 100644
60
+--- a/iniparse/compat.py
61
+@@ -12,19 +12,21 @@ The underlying INIConfig object can be accessed as cfg.data
62
+ """
63
+ 
64
+ import re
65
+-from ConfigParser import DuplicateSectionError,    \
66
+-                  NoSectionError, NoOptionError,   \
67
+-                  InterpolationMissingOptionError, \
68
+-                  InterpolationDepthError,         \
69
+-                  InterpolationSyntaxError,        \
70
+-                  DEFAULTSECT, MAX_INTERPOLATION_DEPTH
71
++from .configparser import DuplicateSectionError,    \
72
++                   NoSectionError, NoOptionError,   \
73
++                   InterpolationMissingOptionError, \
74
++                   InterpolationDepthError,         \
75
++                   InterpolationSyntaxError,        \
76
++                   DEFAULTSECT, MAX_INTERPOLATION_DEPTH
77
+ 
78
+ # These are imported only for compatiability.
79
+ # The code below does not reference them directly.
80
+-from ConfigParser import Error, InterpolationError, \
81
+-                  MissingSectionHeaderError, ParsingError
82
++from .configparser import Error, InterpolationError, \
83
++                   MissingSectionHeaderError, ParsingError
84
+ 
85
+-import ini
86
++import six
87
++
88
++from . import ini
89
+ 
90
+ class RawConfigParser(object):
91
+     def __init__(self, defaults=None, dict_type=dict):
92
+@@ -56,7 +58,7 @@ class RawConfigParser(object):
93
+         # The default section is the only one that gets the case-insensitive
94
+         # treatment - so it is special-cased here.
95
+         if section.lower() == "default":
96
+-            raise ValueError, 'Invalid section name: %s' % section
97
++            raise ValueError('Invalid section name: %s' % section)
98
+ 
99
+         if self.has_section(section):
100
+             raise DuplicateSectionError(section)
101
+@@ -88,7 +90,7 @@ class RawConfigParser(object):
102
+         filename may also be given.
103
+         """
104
+         files_read = []
105
+-        if isinstance(filenames, basestring):
106
++        if isinstance(filenames, six.string_types):
107
+             filenames = [filenames]
108
+         for filename in filenames:
109
+             try:
110
+@@ -143,7 +145,7 @@ class RawConfigParser(object):
111
+     def getboolean(self, section, option):
112
+         v = self.get(section, option)
113
+         if v.lower() not in self._boolean_states:
114
+-            raise ValueError, 'Not a boolean: %s' % v
115
++            raise ValueError('Not a boolean: %s' % v)
116
+         return self._boolean_states[v.lower()]
117
+ 
118
+     def has_option(self, section, option):
119
+@@ -234,7 +236,7 @@ class ConfigParser(RawConfigParser):
120
+             if "%(" in value:
121
+                 try:
122
+                     value = value % vars
123
+-                except KeyError, e:
124
++                except KeyError as e:
125
+                     raise InterpolationMissingOptionError(
126
+                         option, section, rawval, e.args[0])
127
+             else:
128
+@@ -283,7 +285,7 @@ class SafeConfigParser(ConfigParser):
129
+     _badpercent_re = re.compile(r"%[^%]|%$")
130
+ 
131
+     def set(self, section, option, value):
132
+-        if not isinstance(value, basestring):
133
++        if not isinstance(value, six.string_types):
134
+             raise TypeError("option values must be strings")
135
+         # check for bad percent signs:
136
+         # first, replace all "good" interpolations
137
+diff --git a/iniparse/config.py b/iniparse/config.py
138
+index 5cfa2ea..3b28549 100644
139
+--- a/iniparse/config.py
140
+@@ -143,7 +143,7 @@ class BasicConfig(ConfigNamespace):
141
+ 
142
+     >>> n.aaa = 42
143
+     >>> del n.x
144
+-    >>> print n
145
++    >>> print(n)
146
+     aaa = 42
147
+     name.first = paramjit
148
+     name.last = oberoi
149
+@@ -152,7 +152,7 @@ class BasicConfig(ConfigNamespace):
150
+ 
151
+     >>> isinstance(n.name, ConfigNamespace)
152
+     True
153
+-    >>> print n.name
154
++    >>> print(n.name)
155
+     first = paramjit
156
+     last = oberoi
157
+     >>> sorted(list(n.name))
158
+@@ -160,7 +160,7 @@ class BasicConfig(ConfigNamespace):
159
+ 
160
+     Finally, values can be read from a file as follows:
161
+ 
162
+-    >>> from StringIO import StringIO
163
++    >>> from six import StringIO
164
+     >>> sio = StringIO('''
165
+     ... # comment
166
+     ... ui.height = 100
167
+@@ -171,7 +171,7 @@ class BasicConfig(ConfigNamespace):
168
+     ... ''')
169
+     >>> n = BasicConfig()
170
+     >>> n._readfp(sio)
171
+-    >>> print n
172
++    >>> print(n)
173
+     complexity = medium
174
+     data.secret.password = goodness=gracious me
175
+     have_python
176
+@@ -199,7 +199,7 @@ class BasicConfig(ConfigNamespace):
177
+ 
178
+     def __str__(self, prefix=''):
179
+         lines = []
180
+-        keys = self._data.keys()
181
++        keys = list(self._data.keys())
182
+         keys.sort()
183
+         for name in keys:
184
+             value = self._data[name]
185
+@@ -258,7 +258,7 @@ def update_config(target, source):
186
+     >>> n.ui.display_clock = True
187
+     >>> n.ui.display_qlength = True
188
+     >>> n.ui.width = 150
189
+-    >>> print n
190
++    >>> print(n)
191
+     playlist.expand_playlist = True
192
+     ui.display_clock = True
193
+     ui.display_qlength = True
194
+@@ -267,7 +267,7 @@ def update_config(target, source):
195
+     >>> from iniparse import ini
196
+     >>> i = ini.INIConfig()
197
+     >>> update_config(i, n)
198
+-    >>> print i
199
++    >>> print(i)
200
+     [playlist]
201
+     expand_playlist = True
202
+     <BLANKLINE>
203
+@@ -277,7 +277,7 @@ def update_config(target, source):
204
+     width = 150
205
+ 
206
+     """
207
+-    for name in source:
208
++    for name in sorted(source):
209
+         value = source[name]
210
+         if isinstance(value, ConfigNamespace):
211
+             if name in target:
212
+diff --git a/iniparse/configparser.py b/iniparse/configparser.py
213
+new file mode 100644
214
+index 0000000..c543d50
215
+--- /dev/null
216
+@@ -0,0 +1,7 @@
217
++try:
218
++    from ConfigParser import *
219
++    # not all objects get imported with __all__
220
++    from ConfigParser import Error, InterpolationMissingOptionError
221
++except ImportError:
222
++    from configparser import *
223
++    from configparser import Error, InterpolationMissingOptionError
224
+diff --git a/iniparse/ini.py b/iniparse/ini.py
225
+index 408354d..052d9e9 100644
226
+--- a/iniparse/ini.py
227
+@@ -7,7 +7,7 @@
228
+ 
229
+ Example:
230
+ 
231
+-    >>> from StringIO import StringIO
232
++    >>> from six import StringIO
233
+     >>> sio = StringIO('''# configure foo-application
234
+     ... [foo]
235
+     ... bar1 = qualia
236
+@@ -16,14 +16,14 @@ Example:
237
+     ... special = 1''')
238
+ 
239
+     >>> cfg = INIConfig(sio)
240
+-    >>> print cfg.foo.bar1
241
++    >>> print(cfg.foo.bar1)
242
+     qualia
243
+-    >>> print cfg['foo-ext'].special
244
++    >>> print(cfg['foo-ext'].special)
245
+     1
246
+     >>> cfg.foo.newopt = 'hi!'
247
+     >>> cfg.baz.enabled = 0
248
+ 
249
+-    >>> print cfg
250
++    >>> print(cfg)
251
+     # configure foo-application
252
+     [foo]
253
+     bar1 = qualia
254
+@@ -42,9 +42,11 @@ Example:
255
+ # Backward-compatiable with ConfigParser
256
+ 
257
+ import re
258
+-from ConfigParser import DEFAULTSECT, ParsingError, MissingSectionHeaderError
259
++from .configparser import DEFAULTSECT, ParsingError, MissingSectionHeaderError
260
+ 
261
+-import config
262
++import six
263
++
264
++from . import config
265
+ 
266
+ class LineType(object):
267
+     line = None
268
+@@ -278,6 +280,8 @@ class LineContainer(object):
269
+     value = property(get_value, set_value)
270
+ 
271
+     def __str__(self):
272
++        for c in self.contents:
273
++            pass#print(c.__str__())
274
+         s = [x.__str__() for x in self.contents]
275
+         return '\n'.join(s)
276
+ 
277
+@@ -465,7 +469,7 @@ class INIConfig(config.ConfigNamespace):
278
+         self._sections = {}
279
+         if defaults is None: defaults = {}
280
+         self._defaults = INISection(LineContainer(), optionxformsource=self)
281
+-        for name, value in defaults.iteritems():
282
++        for name, value in defaults.items():
283
+             self._defaults[name] = value
284
+         if fp is not None:
285
+             self._readfp(fp)
286
+@@ -551,7 +555,7 @@ class INIConfig(config.ConfigNamespace):
287
+ 
288
+         for line in readline_iterator(fp):
289
+             # Check for BOM on first line
290
+-            if linecount == 0 and isinstance(line, unicode):
291
++            if linecount == 0 and isinstance(line, six.text_type):
292
+                 if line[0] == u'\ufeff':
293
+                     line = line[1:]
294
+                     self._bom = True
295
+diff --git a/iniparse/utils.py b/iniparse/utils.py
296
+index 829fc28..f8b773a 100644
297
+--- a/iniparse/utils.py
298
+@@ -1,5 +1,5 @@
299
+-import compat
300
+-from ini import LineContainer, EmptyLine
301
++from . import compat
302
++from .ini import LineContainer, EmptyLine
303
+ 
304
+ def tidy(cfg):
305
+     """Clean up blank lines.
306
+diff --git a/tests/__init__.py b/tests/__init__.py
307
+index f1fa321..88689fb 100644
308
+--- a/tests/__init__.py
309
+@@ -1,12 +1,12 @@
310
+ import unittest, doctest
311
+ 
312
+-import test_ini
313
+-import test_misc
314
+-import test_fuzz
315
+-import test_compat
316
+-import test_unicode
317
+-import test_tidy
318
+-import test_multiprocessing
319
++from . import test_ini
320
++from . import test_misc
321
++from . import test_fuzz
322
++from . import test_compat
323
++from . import test_unicode
324
++from . import test_tidy
325
++from . import test_multiprocessing
326
+ from iniparse import config
327
+ from iniparse import ini
328
+ 
329
+diff --git a/tests/test_compat.py b/tests/test_compat.py
330
+index b8da3d5..b6dfb5c 100644
331
+--- a/tests/test_compat.py
332
+@@ -1,9 +1,16 @@
333
+ from iniparse import compat as ConfigParser
334
+-import StringIO
335
++from six import StringIO
336
++try:
337
++    import UserDict
338
++except ImportError:
339
++    import collections as UserDict
340
+ import unittest
341
+-import UserDict
342
+ 
343
+-from test import test_support
344
++import sys
345
++if sys.version_info[0] < 3:
346
++    from test import test_support
347
++else:
348
++    from test import support as test_support
349
+ 
350
+ class SortedDict(UserDict.UserDict):
351
+     def items(self):
352
+@@ -35,7 +42,7 @@ class TestCaseBase(unittest.TestCase):
353
+ 
354
+     def fromstring(self, string, defaults=None):
355
+         cf = self.newconfig(defaults)
356
+-        sio = StringIO.StringIO(string)
357
++        sio = StringIO(string)
358
+         cf.readfp(sio)
359
+         return cf
360
+ 
361
+@@ -161,7 +168,7 @@ class TestCaseBase(unittest.TestCase):
362
+                          "No Section!\n")
363
+ 
364
+     def parse_error(self, exc, src):
365
+-        sio = StringIO.StringIO(src)
366
++        sio = StringIO(src)
367
+         self.assertRaises(exc, self.cf.readfp, sio)
368
+ 
369
+     def test_query_errors(self):
370
+@@ -181,7 +188,7 @@ class TestCaseBase(unittest.TestCase):
371
+     def get_error(self, exc, section, option):
372
+         try:
373
+             self.cf.get(section, option)
374
+-        except exc, e:
375
++        except exc as e:
376
+             return e
377
+         else:
378
+             self.fail("expected exception type %s.%s"
379
+@@ -227,7 +234,7 @@ class TestCaseBase(unittest.TestCase):
380
+             "foo: another very\n"
381
+             " long line"
382
+             )
383
+-        output = StringIO.StringIO()
384
++        output = StringIO()
385
+         cf.write(output)
386
+         self.assertEqual(
387
+             output.getvalue(),
388
+@@ -465,7 +472,7 @@ class SortedTestCase(RawConfigParserTestCase):
389
+                         "o1=4\n"
390
+                         "[a]\n"
391
+                         "k=v\n")
392
+-        output = StringIO.StringIO()
393
++        output = StringIO()
394
+         self.cf.write(output)
395
+         self.assertEquals(output.getvalue(),
396
+                           "[a]\n"
397
+diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py
398
+index 5420dcc..b219500 100644
399
+--- a/tests/test_fuzz.py
400
+@@ -1,9 +1,10 @@
401
+ import re
402
+ import os
403
+ import random
404
++import sys
405
+ import unittest
406
+-import ConfigParser
407
+-from StringIO import StringIO
408
++from six import StringIO
409
++from six.moves import configparser
410
+ from iniparse import compat, ini, tidy
411
+ 
412
+ # TODO:
413
+@@ -96,24 +97,25 @@ class test_fuzz(unittest.TestCase):
414
+                 s = '\n'.join(good_lines)
415
+                 cc = compat.RawConfigParser()
416
+                 cc.readfp(StringIO(s))
417
+-                cc_py = ConfigParser.RawConfigParser()
418
++                cc_py = configparser.RawConfigParser()
419
+                 cc_py.readfp(StringIO(s))
420
+                 # compare the two configparsers
421
+                 self.assertEqualConfig(cc_py, cc)
422
+                 # check that tidy does not change semantics
423
+                 tidy(cc)
424
+-                cc_tidy = ConfigParser.RawConfigParser()
425
++                cc_tidy = configparser.RawConfigParser()
426
+                 cc_tidy.readfp(StringIO(str(cc.data)))
427
+                 self.assertEqualConfig(cc_py, cc_tidy)
428
+             except AssertionError:
429
+                 fname = 'fuzz-test-iter-%d.ini' % fuzz_iter
430
+-                print 'Fuzz test failed at iteration', fuzz_iter
431
+-                print 'Writing out failing INI file as', fname
432
++                print('Fuzz test failed at iteration', fuzz_iter)
433
++                print('Writing out failing INI file as', fname)
434
+                 f = open(fname, 'w')
435
+                 f.write(s)
436
+                 f.close()
437
+                 raise
438
+ 
439
++    @unittest.skipIf(sys.version_info[0] > 2, 'http://code.google.com/p/iniparse/issues/detail?id=22#c9')
440
+     def assertEqualConfig(self, c1, c2):
441
+         self.assertEqualSorted(c1.sections(), c2.sections())
442
+         self.assertEqualSorted(c1.defaults().items(), c2.defaults().items())
443
+@@ -123,9 +125,7 @@ class test_fuzz(unittest.TestCase):
444
+                 self.assertEqual(c1.get(sec, opt), c2.get(sec, opt))
445
+ 
446
+     def assertEqualSorted(self, l1, l2):
447
+-        l1.sort()
448
+-        l2.sort()
449
+-        self.assertEqual(l1, l2)
450
++        self.assertEqual(sorted(l1), sorted(l2))
451
+ 
452
+ class suite(unittest.TestSuite):
453
+     def __init__(self):
454
+diff --git a/tests/test_ini.py b/tests/test_ini.py
455
+index 6a76edb..07d4f4e 100644
456
+--- a/tests/test_ini.py
457
+@@ -1,5 +1,5 @@
458
+ import unittest
459
+-from StringIO import StringIO
460
++from six import StringIO
461
+ 
462
+ from iniparse import ini
463
+ from iniparse import compat
464
+@@ -196,13 +196,13 @@ but = also me
465
+         self.assertEqual(p._data.find('section2').find('just').value, 'kidding')
466
+ 
467
+         itr = p._data.finditer('section1')
468
+-        v = itr.next()
469
++        v = next(itr)
470
+         self.assertEqual(v.find('help').value, 'yourself')
471
+         self.assertEqual(v.find('but').value, 'also me')
472
+-        v = itr.next()
473
++        v = next(itr)
474
+         self.assertEqual(v.find('help').value, 'me')
475
+         self.assertEqual(v.find('I\'m').value, 'desperate')
476
+-        self.assertRaises(StopIteration, itr.next)
477
++        self.assertRaises(StopIteration, next, itr)
478
+ 
479
+         self.assertRaises(KeyError, p._data.find, 'section')
480
+         self.assertRaises(KeyError, p._data.find('section2').find, 'ahem')
481
+diff --git a/tests/test_misc.py b/tests/test_misc.py
482
+index 31cf4da..96ef035 100644
483
+--- a/tests/test_misc.py
484
+@@ -1,9 +1,9 @@
485
+ import re
486
+ import unittest
487
+ import pickle
488
+-import ConfigParser
489
++from six.moves import configparser
490
++from six import StringIO
491
+ from textwrap import dedent
492
+-from StringIO import StringIO
493
+ from iniparse import compat, ini
494
+ 
495
+ class CaseSensitiveConfigParser(compat.ConfigParser):
496
+diff --git a/tests/test_tidy.py b/tests/test_tidy.py
497
+index 7304747..26b6cde 100644
498
+--- a/tests/test_tidy.py
499
+@@ -1,6 +1,6 @@
500
+ import unittest
501
+ from textwrap import dedent
502
+-from StringIO import StringIO
503
++from six import StringIO
504
+ 
505
+ from iniparse import tidy,INIConfig
506
+ from iniparse.ini import  EmptyLine
507
+diff --git a/tests/test_unicode.py b/tests/test_unicode.py
508
+index a56fcab..14d4fbd 100644
509
+--- a/tests/test_unicode.py
510
+@@ -1,5 +1,5 @@
511
+ import unittest
512
+-from StringIO import StringIO
513
++import six
514
+ from iniparse import compat, ini
515
+ 
516
+ class test_unicode(unittest.TestCase):
517
+@@ -17,14 +17,14 @@ baz = Marc-Andr\202
518
+     """
519
+ 
520
+     def basic_tests(self, s, strable):
521
+-        f = StringIO(s)
522
++        f = six.StringIO(s)
523
+         i = ini.INIConfig(f)
524
+-        self.assertEqual(unicode(i), s)
525
+-        self.assertEqual(type(i.foo.bar), unicode)
526
++        self.assertEqual(six.text_type(i), s)
527
++        self.assertEqual(type(i.foo.bar), six.text_type)
528
+         if strable:
529
+             self.assertEqual(str(i), str(s))
530
+         else:
531
+-            self.assertRaises(UnicodeEncodeError, lambda: str(i))
532
++            self.assertRaises(UnicodeEncodeError, lambda: six.text_type(i).encode('ascii'))
533
+         return i
534
+ 
535
+     def test_ascii(self):
536
+-- 
537
+2.11.0
538
+
... ...
@@ -3,19 +3,23 @@
3 3
 
4 4
 Name:           python-iniparse
5 5
 Version:        0.4
6
-Release:        5%{?dist}
6
+Release:        6%{?dist}
7 7
 Summary:        Python Module for Accessing and Modifying Configuration Data in INI files
8 8
 Group:          Development/Libraries
9 9
 License:        MIT
10 10
 URL:            http://code.google.com/p/iniparse/
11 11
 Source0:        http://iniparse.googlecode.com/files/iniparse-%{version}.tar.gz
12 12
 %define sha1 iniparse=2b2af8a19f3e5c212c27d7c524cd748fa0b38650
13
-Patch0:         iniparse-py3-build.patch
13
+Patch0:         0001-Add-python-3-compatibility.patch
14 14
 Vendor:         VMware, Inc.
15 15
 Distribution:   Photon
16
+
17
+BuildArch:      noarch
18
+
16 19
 BuildRequires:  python2-devel
17 20
 BuildRequires:  python2-libs
18
-BuildArch:      noarch
21
+BuildRequires:  python2-test
22
+
19 23
 Requires:       python2
20 24
 
21 25
 %description
... ...
@@ -30,18 +34,23 @@ Summary:        python-iniparse
30 30
 BuildRequires:  python3
31 31
 BuildRequires:  python3-devel
32 32
 BuildRequires:  python3-libs
33
+BuildRequires:  python3-six
34
+BuildRequires:  python3-test
33 35
 Requires:       python3
34 36
 Requires:       python3-libs
35 37
 Requires:       python3-pycparser
38
+Requires:       python3-six
36 39
 
37 40
 %description -n python3-iniparse
38 41
 Python 3 version.
39 42
 
40 43
 %prep
41 44
 %setup -q -n iniparse-%{version}
42
-%patch0 -p1
43 45
 rm -rf ../p3dir
44 46
 cp -a . ../p3dir
47
+pushd ../p3dir
48
+%patch0 -p1
49
+popd
45 50
 
46 51
 %build
47 52
 python2 setup.py build
... ...
@@ -60,24 +69,10 @@ mv %{buildroot}/usr/share/doc/iniparse-%{version} %{buildroot}/usr/share/doc/pyt
60 60
 
61 61
 
62 62
 %check
63
-cp -r iniparse/ tests/
64
-cd tests
65
-python2 test_misc.py
66
-python2 test_tidy.py
67
-python2 test_fuzz.py
68
-python2 test_ini.py
69
-python2 test_multiprocessing.py
70
-python2 test_unicode.py
63
+python2 runtests.py
71 64
 
72 65
 pushd ../p3dir
73
-cp -r iniparse/ tests/
74
-cd tests
75
-python3 test_misc.py
76
-python3 test_tidy.py
77
-python3 test_fuzz.py
78
-python3 test_ini.py
79
-python3 test_multiprocessing.py
80
-python3 test_unicode.py
66
+python3 runtests.py
81 67
 popd
82 68
 
83 69
 
... ...
@@ -92,6 +87,8 @@ popd
92 92
 
93 93
 
94 94
 %changelog
95
+*   Tue Jul 11 2017 Xiaolin Li <xiaolinl@vmware.com> 0.4-6
96
+-   Fix python3 and make check issues.
95 97
 *   Thu Jun 01 2017 Dheeraj Shetty <dheerajs@vmware.com> 0.4-5
96 98
 -   Use python2 explicitly to build
97 99
 *   Mon May 22 2017 Xiaolin Li <xiaolinl@vmware.com> 0.4-4
... ...
@@ -1,7 +1,7 @@
1 1
 Summary:        A high-level scripting language
2 2
 Name:           python2
3 3
 Version:        2.7.13
4
-Release:        6%{?dist}
4
+Release:        7%{?dist}
5 5
 License:        PSF
6 6
 URL:            http://www.python.org/
7 7
 Group:          System Environment/Programming
... ...
@@ -100,6 +100,13 @@ Requires: python2 = %{version}-%{release}
100 100
 The Python package includes several development tools that are used
101 101
 to build python programs.
102 102
 
103
+%package test
104
+Summary: Regression tests package for Python.
105
+Group: Development/Tools
106
+Requires: python2 = %{version}-%{release}
107
+
108
+%description test
109
+The test package contains all regression tests for Python as well as the modules test.support and test.regrtest. test.support is used to enhance your tests while test.regrtest drives the testing suite.
103 110
 
104 111
 %prep
105 112
 %setup -q -n Python-%{version}
... ...
@@ -222,7 +229,12 @@ rm -rf %{buildroot}/*
222 222
 %exclude %{_bindir}/smtpd.py
223 223
 %exclude %{_bindir}/idle*
224 224
 
225
+%files test
226
+%{_libdir}/python2.7/test/*
227
+
225 228
 %changelog
229
+*   Wed Jul 12 2017 Xiaolin Li <xiaolinl@vmware.com> 2.7.13-7
230
+-   Add python2-test package.
226 231
 *   Sun Jun 04 2017 Bo Gan <ganb@vmware.com> 2.7.13-6
227 232
 -   Fix dependency for libs
228 233
 *   Tue May 16 2017 Kumar Kaushik <kaushikk@vmware.com> 2.7.13-5
... ...
@@ -1,7 +1,7 @@
1 1
 Summary:        A high-level scripting language
2 2
 Name:           python3
3 3
 Version:        3.6.1
4
-Release:        5%{?dist}
4
+Release:        6%{?dist}
5 5
 License:        PSF
6 6
 URL:            http://www.python.org/
7 7
 Group:          System Environment/Programming
... ...
@@ -122,6 +122,14 @@ Requires:       python3 = %{version}-%{release}
122 122
 %description    setuptools
123 123
 setuptools is a collection of enhancements to the Python distutils that allow you to more easily build and distribute Python packages, especially ones that have dependencies on other packages.
124 124
 
125
+%package test
126
+Summary: Regression tests package for Python.
127
+Group: Development/Tools
128
+Requires: python3 = %{version}-%{release}
129
+
130
+%description test
131
+The test package contains all regression tests for Python as well as the modules test.support and test.regrtest. test.support is used to enhance your tests while test.regrtest drives the testing suite.
132
+
125 133
 %prep
126 134
 %setup -q -n Python-%{version}
127 135
 %patch0 -p1
... ...
@@ -251,7 +259,12 @@ rm -rf %{buildroot}/*
251 251
 %{_libdir}/python3.6/site-packages/setuptools-28.8.0.dist-info/*
252 252
 %{_bindir}/easy_install-3.6
253 253
 
254
+%files test
255
+%{_libdir}/python3.6/test/*
256
+
254 257
 %changelog
258
+*   Wed Jul 12 2017 Xiaolin Li <xiaolinl@vmware.com> 3.6.1-6
259
+-   Add python3-test package.
255 260
 *   Fri Jun 30 2017 Dheeraj Shetty <dheerajs@vmware.com> 3.6.1-5
256 261
 -   Remove the imaplib tests.
257 262
 *   Mon Jun 05 2017 Xiaolin Li <xiaolinl@vmware.com> 3.6.1-4