Source code for ewokscore.node
from typing import Optional, Union
NodeIdType = Union[str, int, tuple]
SEPARATOR = ":"
[docs]
def flatten_node_id(node_id: NodeIdType) -> tuple:
if isinstance(node_id, str):
return (node_id,)
elif isinstance(node_id, int):
return str(node_id)
elif len(node_id) == 1:
return (node_id[0],)
else:
return (node_id[0],) + flatten_node_id(node_id[1])
[docs]
def node_id_as_string(node_id: NodeIdType, sep: Optional[str] = None) -> str:
if sep is None:
sep = SEPARATOR
return sep.join(flatten_node_id(node_id))
[docs]
def node_id_from_json(node_id: Union[list, NodeIdType]) -> NodeIdType:
if isinstance(node_id, list):
return tuple(map(node_id_from_json, node_id))
return node_id
[docs]
def get_node_id(
node_id: Optional[NodeIdType], node_attrs: Optional[dict]
) -> Optional[NodeIdType]:
if node_id is None and node_attrs:
return node_attrs.get("id")
return node_id
[docs]
def get_node_label(
node_id: Optional[NodeIdType], node_attrs: Optional[dict], sep: Optional[str] = None
) -> Optional[str]:
if node_attrs:
node_label = node_attrs.get("label")
if node_label:
return node_label
node_id = get_node_id(node_id, node_attrs)
if node_id:
return node_id_as_string(node_id, sep=sep)
return None
[docs]
def get_varinfo(node_attrs: Optional[dict], varinfo: Optional[dict] = None) -> dict:
"""Makes a copy"""
if varinfo is None:
varinfo = dict()
else:
varinfo = dict(varinfo)
if node_attrs:
varinfo.update(node_attrs.get("varinfo", dict()))
return varinfo
[docs]
def get_task_identifier(node_attrs: Optional[dict], default: Optional[str] = None):
if node_attrs:
return node_attrs.get("task_identifier", default)
return default