Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit e4f8a58

Browse filesBrowse files
committed
RangeSet: accept unicode strings on Python 2
On Python 2, isinstance(x, str) excludes unicode: a unicode pattern gave an empty RangeSet and a unicode vector raised ValueError in RangeSetND. Check basestring instead of str. No-op on Python 3. Signed-off-by: Stephane Thiell <sthiell@stanford.edu>
1 parent 8755d96 commit e4f8a58
Copy full SHA for e4f8a58

3 files changed

+38-7Lines changed: 38 additions & 7 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎lib/ClusterShell/RangeSet.py‎

Copy file name to clipboardExpand all lines: lib/ClusterShell/RangeSet.py
+7-7Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def __init__(self, pattern=None, autostep=None):
129129
"""
130130
set.__init__(self)
131131

132-
if pattern is not None and not isinstance(pattern, str):
132+
if pattern is not None and not isinstance(pattern, basestring):
133133
pattern = ",".join("%s" % i for i in pattern)
134134

135135
if isinstance(pattern, RangeSet):
@@ -138,7 +138,7 @@ def __init__(self, pattern=None, autostep=None):
138138
self._autostep = None
139139
self.autostep = autostep #: autostep threshold public instance attribute
140140

141-
if isinstance(pattern, str):
141+
if isinstance(pattern, basestring):
142142
self._parse(pattern)
143143

144144
def _parse(self, pattern):
@@ -809,7 +809,7 @@ def difference_update(self, other, strict=False):
809809

810810
def update(self, iterable):
811811
"""Add all indexes (as strings) from an iterable (such as a list)."""
812-
assert not isinstance(iterable, str)
812+
assert not isinstance(iterable, basestring)
813813
set.update(self, iterable)
814814

815815
def updaten(self, rangesets):
@@ -839,7 +839,7 @@ def add(self, element, pad=0):
839839
:param element: the element to add (integer or string)
840840
:param pad: zero padding length (integer); ignored if element is string
841841
"""
842-
if isinstance(element, str):
842+
if isinstance(element, basestring):
843843
set.add(self, element)
844844
else:
845845
set.add(self, "%0*d" % (pad, int(element)))
@@ -856,7 +856,7 @@ def remove(self, element, pad=0):
856856
:raises KeyError: element is not contained in RangeSet
857857
:raises ValueError: element is not castable to integer
858858
"""
859-
if isinstance(element, str):
859+
if isinstance(element, basestring):
860860
set.remove(self, element)
861861
else:
862862
set.remove(self, "%0*d" % (pad, int(element)))
@@ -874,7 +874,7 @@ def discard(self, element, pad=0):
874874
:param pad: zero padding length (integer); ignored if element is string
875875
"""
876876
try:
877-
if isinstance(element, str):
877+
if isinstance(element, basestring):
878878
set.discard(self, element)
879879
else:
880880
set.discard(self, "%0*d" % (pad, int(element)))
@@ -934,7 +934,7 @@ def __init__(self, args=None, pads=None, autostep=None, copy_rangeset=True):
934934
return
935935
for rgvec in args:
936936
if rgvec:
937-
if isinstance(rgvec[0], str):
937+
if isinstance(rgvec[0], basestring):
938938
self._veclist.append([RangeSet(rg, autostep=autostep) \
939939
for rg in rgvec])
940940
elif isinstance(rgvec[0], RangeSet):
Collapse file

‎tests/RangeSetNDTest.py‎

Copy file name to clipboardExpand all lines: tests/RangeSetNDTest.py
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ def test_vectors(self):
4242
self.assertEqual(str(rn), "11-60; 2\n0-10; 1-2\n")
4343
self.assertEqual(len(rn), 72)
4444

45+
def test_unicode(self):
46+
# Python 2 compat: unicode string vectors parse like byte strings
47+
self._testRS([[u"0-10"], [u"40-60"]], "0-10,40-60\n", 32)
48+
self.assertEqual(RangeSetND([[u"0-3", u"4-10"]]),
49+
RangeSetND([["0-3", "4-10"]]))
50+
4551
def test_nonzero(self):
4652
r0 = RangeSetND()
4753
if r0:
Collapse file

‎tests/RangeSetTest.py‎

Copy file name to clipboardExpand all lines: tests/RangeSetTest.py
+25Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ def testSimple(self):
2929
self._testRS("1-3,4-6", "1-6", 6)
3030
self._testRS("1-3,4-6,7-10", "1-10", 10)
3131

32+
def testParseUnicode(self):
33+
"""test RangeSet unicode pattern parsing"""
34+
# Python 2 compat
35+
self.assertEqual(RangeSet(u"01-10"), RangeSet("01-10"))
36+
self.assertEqual(len(RangeSet(u"0001-0100")), 100)
37+
3238
def testStepSimple(self):
3339
"""test RangeSet simple step usages"""
3440
self._testRS("0-4/2", "0-4/2", 3)
@@ -644,6 +650,11 @@ def testAdd(self):
644650
r1.padding = 4 # 1.8-1.9 compat: adjust padding of the whole set
645651
self.assertEqual(len(r1), 241)
646652
self.assertEqual(str(r1), "0001-0100,0102,0105-0242,0800-0801")
653+
# unicode element accepted like byte str (Python 2 compat)
654+
ra, rb = RangeSet("1-10"), RangeSet("1-10")
655+
ra.add(u"011")
656+
rb.add("011")
657+
self.assertEqual(ra, rb)
647658

648659
def testUpdate(self):
649660
"""test RangeSet.update()"""
@@ -695,6 +706,13 @@ def testRemove(self):
695706
self.assertRaises(KeyError, r1.remove, "101")
696707
r1.remove("106")
697708
self.assertRaises(KeyError, r1.remove, "foo")
709+
# unicode element accepted like byte str (Python 2 compat)
710+
ra, rb = RangeSet("1-10"), RangeSet("1-10")
711+
ra.remove(u"5")
712+
rb.remove("5")
713+
self.assertEqual(ra, rb)
714+
self.assertRaises(KeyError, ra.remove, u"5")
715+
self.assertRaises(KeyError, ra.remove, u"foo")
698716

699717
def testDiscard(self):
700718
"""test RangeSet.discard()"""
@@ -708,6 +726,13 @@ def testDiscard(self):
708726
self.assertEqual(len(r1), 238)
709727
self.assertEqual(str(r1), "1-99,102,106-242,800")
710728
r1.discard("foo")
729+
# unicode element accepted like byte str (Python 2 compat)
730+
ra, rb = RangeSet("1-10"), RangeSet("1-10")
731+
ra.discard(u"5")
732+
rb.discard("5")
733+
ra.discard(u"bar") # non-numeric unicode: no exception
734+
self.assertEqual(ra, rb)
735+
self.assertEqual(str(ra), "1-4,6-10")
711736

712737
def testClear(self):
713738
"""test RangeSet.clear()"""

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.