1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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)