| Viewing file:  _text.py (2.12 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
import re
 from ._functools import method_cache
 
 
 # from jaraco.text 3.5
 class FoldedCase(str):
 """
 A case insensitive string class; behaves just like str
 except compares equal when the only variation is case.
 
 >>> s = FoldedCase('hello world')
 
 >>> s == 'Hello World'
 True
 
 >>> 'Hello World' == s
 True
 
 >>> s != 'Hello World'
 False
 
 >>> s.index('O')
 4
 
 >>> s.split('O')
 ['hell', ' w', 'rld']
 
 >>> sorted(map(FoldedCase, ['GAMMA', 'alpha', 'Beta']))
 ['alpha', 'Beta', 'GAMMA']
 
 Sequence membership is straightforward.
 
 >>> "Hello World" in [s]
 True
 >>> s in ["Hello World"]
 True
 
 You may test for set inclusion, but candidate and elements
 must both be folded.
 
 >>> FoldedCase("Hello World") in {s}
 True
 >>> s in {FoldedCase("Hello World")}
 True
 
 String inclusion works as long as the FoldedCase object
 is on the right.
 
 >>> "hello" in FoldedCase("Hello World")
 True
 
 But not if the FoldedCase object is on the left:
 
 >>> FoldedCase('hello') in 'Hello World'
 False
 
 In that case, use in_:
 
 >>> FoldedCase('hello').in_('Hello World')
 True
 
 >>> FoldedCase('hello') > FoldedCase('Hello')
 False
 """
 
 def __lt__(self, other):
 return self.lower() < other.lower()
 
 def __gt__(self, other):
 return self.lower() > other.lower()
 
 def __eq__(self, other):
 return self.lower() == other.lower()
 
 def __ne__(self, other):
 return self.lower() != other.lower()
 
 def __hash__(self):
 return hash(self.lower())
 
 def __contains__(self, other):
 return super().lower().__contains__(other.lower())
 
 def in_(self, other):
 "Does self appear in other?"
 return self in FoldedCase(other)
 
 # cache lower since it's likely to be called frequently.
 @method_cache
 def lower(self):
 return super().lower()
 
 def index(self, sub):
 return self.lower().index(sub.lower())
 
 def split(self, splitter=' ', maxsplit=0):
 pattern = re.compile(re.escape(splitter), re.I)
 return pattern.split(self, maxsplit)
 
 |