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
|