38 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
SEP = "/"
 | 
						|
 | 
						|
 | 
						|
def _splitnode(nodeid):
 | 
						|
    """Split a nodeid into constituent 'parts'.
 | 
						|
 | 
						|
    Node IDs are strings, and can be things like:
 | 
						|
        ''
 | 
						|
        'testing/code'
 | 
						|
        'testing/code/test_excinfo.py'
 | 
						|
        'testing/code/test_excinfo.py::TestFormattedExcinfo::()'
 | 
						|
 | 
						|
    Return values are lists e.g.
 | 
						|
        []
 | 
						|
        ['testing', 'code']
 | 
						|
        ['testing', 'code', 'test_excinfo.py']
 | 
						|
        ['testing', 'code', 'test_excinfo.py', 'TestFormattedExcinfo', '()']
 | 
						|
    """
 | 
						|
    if nodeid == '':
 | 
						|
        # If there is no root node at all, return an empty list so the caller's logic can remain sane
 | 
						|
        return []
 | 
						|
    parts = nodeid.split(SEP)
 | 
						|
    # Replace single last element 'test_foo.py::Bar::()' with multiple elements 'test_foo.py', 'Bar', '()'
 | 
						|
    parts[-1:] = parts[-1].split("::")
 | 
						|
    return parts
 | 
						|
 | 
						|
 | 
						|
def ischildnode(baseid, nodeid):
 | 
						|
    """Return True if the nodeid is a child node of the baseid.
 | 
						|
 | 
						|
    E.g. 'foo/bar::Baz::()' is a child of 'foo', 'foo/bar' and 'foo/bar::Baz', but not of 'foo/blorp'
 | 
						|
    """
 | 
						|
    base_parts = _splitnode(baseid)
 | 
						|
    node_parts = _splitnode(nodeid)
 | 
						|
    if len(node_parts) < len(base_parts):
 | 
						|
        return False
 | 
						|
    return node_parts[:len(base_parts)] == base_parts
 |