mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	* bpo-44893: Implement EntryPoint as simple class and deprecate tuple access in favor of attribute access. Syncs with importlib_metadata 4.8.1. * Apply refactorings found in importlib_metadata 4.8.2.
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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)
 |