import meshed as ms
import pytest
import meshed.base
import meshed.util
from meshed.dag import ch_funcs, _validate_func_mapping
from meshed.tests.objects_for_testing import f, g
from meshed.base import compare_signatures
from i2 import Sig
from typing import NamedTuple
@pytest.fixture
def example_func_nodes():
funcs = [f, g]
result = meshed.base._mk_func_nodes(funcs)
return result
@pytest.fixture
def example_func_mapping():
mapping = {'f_': f, 'g_': g}
return mapping
def test_ch_funcs_no_change(example_func_nodes):
funcs = [f, g]
nodes = list(example_func_nodes)
names = [node.name for node in nodes]
dummy_mapping = dict(zip(names, funcs))
new_dag = ch_funcs(func_nodes=nodes, func_mapping=dummy_mapping,)
new_nodes = new_dag().func_nodes
assert nodes == new_nodes
[docs]
class FlagWithMessage(NamedTuple):
flag: bool
msg: str = ''
# This function is used to give a more detailed report on
# mismatched signatures
# the same can be done by tweaking ch_func_node_func
# and its "alternative" param
[docs]
def validate_func_mapping_on_signatures(func_mapping, func_nodes):
"""
This function is used to give a more detailed report on
mismatched signatures
The same can be done by tweaking ch_func_node_func
and its "alternative" param
"""
from meshed import DAG
_validate_func_mapping(func_mapping, func_nodes)
d = dict()
dag = DAG(func_nodes)
for key, func in func_mapping.items():
if fnode := dag._func_node_for.get(key, None):
old_func = fnode.func
if compare_signatures(old_func, func):
result = FlagWithMessage(flag=True)
else:
msg = f'Signatures disagree for key={key}'
result = FlagWithMessage(flag=False, msg=msg)
else:
msg = f'No funcnode matching the key {key}'
result = FlagWithMessage(flag=False, msg=msg)
d[key] = result
all_flags_true = all(item.flag for item in d.values())
return all_flags_true, d
def test_validate_func_mapping_based_on_signatures(
example_func_nodes, example_func_mapping
):
nodes = list(example_func_nodes)
# funcs = [f, g]
func_mapping = example_func_mapping
result = validate_func_mapping_on_signatures(func_mapping, nodes)
expected = (
True,
{
'f_': FlagWithMessage(flag=True, msg=''),
'g_': FlagWithMessage(flag=True, msg=''),
},
)
assert result == expected
[docs]
def test_validate_bind_attributes():
"""
in ch_func_node_func: validate compatibility (not equality of sigs)
we cannot use call_compatibility
rename everything
https://github.com/i2mint/i2/issues/47
"""
pass