diff --git a/.vscode/settings.json b/.vscode/settings.json index 5d4040b..8680df1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,4 @@ { - "python.testing.unittestArgs": ["-v", "-s", "./tests", "-p", "test*.py"], - "python.testing.pytestEnabled": false, - "python.testing.unittestEnabled": true + "python.testing.pytestEnabled": true, + "python.testing.unittestEnabled": false } diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0eab581 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +## v0.2.4 (2025-06-05) + +### Fix + +- **dependencies**: 🐛 update `funcnodes-core` version to `0.4.1` +- **logic**: 🐛 improve async handling in WhileNode and ForNode +- **dependencies**: update funcnodes-core version to 0.4.0 + +## v0.1.6 (2024-08-28) diff --git a/pyproject.toml b/pyproject.toml index 200df8a..b34d38c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "funcnodes-basic" -version = "0.2.3" +version = "0.2.4" description = "Basic functionalities for funcnodes" readme = "README.md" classifiers = [ "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",] requires-python = ">=3.11" dependencies = [ - "funcnodes-core>=0.3.9", + "funcnodes-core>=0.4.1", "funcnodes", ] authors = [{name = "Julian Kimmig", email = "julian.kimmig@linkdlab.de"}] @@ -43,3 +43,10 @@ shelf = "funcnodes_basic:NODE_SHELF" [tool.setuptools.packages.find] where = [ "src",] + +[tool.commitizen] +name = "cz_conventional_commits" +tag_format = "v$version" +version_scheme = "pep440" +version_provider = "uv" +update_changelog_on_bump = true diff --git a/src/funcnodes_basic/logic.py b/src/funcnodes_basic/logic.py index 6c1168b..012856b 100644 --- a/src/funcnodes_basic/logic.py +++ b/src/funcnodes_basic/logic.py @@ -1,6 +1,6 @@ """Logic Nodes for control flow and decision making.""" -from funcnodes_core.node import Node, TriggerStack +from funcnodes_core.node import Node from typing import Any, List, Optional from funcnodes_core.io import NodeInput, NodeOutput, NoValue import asyncio @@ -35,8 +35,19 @@ class WhileNode(Node): async def func(self, condition: bool, input: Any) -> None: if self.inputs["condition"].value: self.outputs["do"].value = input - triggerstack = TriggerStack() - await self.outputs["do"].trigger(triggerstack) + datapaths = [ + ip.datapath + for ip in self.outputs["do"].connections + if ip.datapath is not None + ] + + while datapaths: + for dp in datapaths: + if dp.done(breaking_nodes=[self]): + datapaths.remove(dp) + break + else: + await asyncio.sleep(0.1) self.request_trigger() else: self.outputs["done"].value = input @@ -94,9 +105,21 @@ async def func(self, input: list, collector: Optional[Any] = None) -> None: pass for i in self.progress(input, desc="Iterating", unit="it", total=iplen): - self.outputs["do"].set_value(i, does_trigger=False) - triggerstack = TriggerStack() - await self.outputs["do"].trigger(triggerstack) + self.outputs["do"].set_value(i, does_trigger=True) + datapaths = [ + ip.datapath + for ip in self.outputs["do"].connections + if ip.datapath is not None + ] + + while datapaths: + for dp in datapaths: + if dp.done(breaking_nodes=[self]): + datapaths.remove(dp) + break + else: + await asyncio.sleep(0.1) + v = self.inputs["collector"].value if v is not NoValue: results.append(v) diff --git a/tests/test_flows.py b/tests/test_flows.py new file mode 100644 index 0000000..3ee8ce3 --- /dev/null +++ b/tests/test_flows.py @@ -0,0 +1,26 @@ +from funcnodes_basic import logic, strings +import pytest_funcnodes +import asyncio + + +@pytest_funcnodes.nodetest(logic.ForNode) +async def test_if_node_flow1(): + fornode = logic.ForNode() + endswith = strings.string_endswith() + ifnode = logic.IfNode() + + fornode.outputs["do"].connect(endswith.inputs["s"]) + endswith.outputs["ends_with"].connect(ifnode.inputs["condition"]) + fornode.outputs["do"].connect(ifnode.inputs["input"]) + ifnode.outputs["on_true"].connect(fornode.inputs["collector"]) + + endswith.inputs["suffix"].value = ".txt" + fornode.inputs["input"].value = ["a.txt", "b.xls", "c.xls", "d.txt", "e.xls"] + + # await fn.run_until_complete(fornode, ifnode, endswith) + await asyncio.sleep(1.5) + print("fornode:", fornode.in_trigger) + print("ifnode:", ifnode.in_trigger) + print("endswith:", endswith.in_trigger) + + assert fornode.outputs["done"].value == ["a.txt", "d.txt"] diff --git a/tests/test_logic.py b/tests/test_logic.py index 0a4748d..c043fd5 100644 --- a/tests/test_logic.py +++ b/tests/test_logic.py @@ -42,8 +42,12 @@ async def test_wait_node(): @pytest_funcnodes.nodetest(logic.ForNode) async def test_for_node(): node = logic.ForNode() + waitnode = logic.WaitNode() + waitnode.inputs["delay"].value = 0.5 + waitnode.inputs["input"].connect(node.outputs["do"]) + waitnode.outputs["output"].connect(node.inputs["collector"]) node.inputs["input"].value = "hello" - node.outputs["do"].connect(node.inputs["collector"]) + await node assert node.outputs["done"].value == ["h", "e", "l", "l", "o"] diff --git a/uv.lock b/uv.lock index 30c447d..c00286c 100644 --- a/uv.lock +++ b/uv.lock @@ -380,7 +380,7 @@ wheels = [ [[package]] name = "funcnodes-basic" -version = "0.2.3" +version = "0.2.4" source = { editable = "." } dependencies = [ { name = "funcnodes" }, @@ -398,7 +398,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "funcnodes" }, - { name = "funcnodes-core", specifier = ">=0.3.9" }, + { name = "funcnodes-core", specifier = ">=0.4.1" }, ] [package.metadata.requires-dev] @@ -411,7 +411,7 @@ dev = [ [[package]] name = "funcnodes-core" -version = "0.3.53" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dill" }, @@ -420,9 +420,9 @@ dependencies = [ { name = "setuptools" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/cf/6c8c7f06abe437355c95b0b7c59e94efe12cea60772df56fac3aa6e850ee/funcnodes_core-0.3.53.tar.gz", hash = "sha256:2356def5c0c41f07ed895da299685e89d4c46537f927e8a1213bf81d440b8aaf", size = 93160 } +sdist = { url = "https://files.pythonhosted.org/packages/63/4e/5e14ba6b5e5b539a37329a0f8b44ee463dda0587bb5f55baad4f71aefc16/funcnodes_core-0.4.1.tar.gz", hash = "sha256:d954d1729cb43591bc6c5efbd1768ccbc979559f50750373ef79f93e47164cd7", size = 97954 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ea/a6fc4d30cbe3174caac20ef6b1e60d725506b325d8aa5f272ad8c1b6bf4f/funcnodes_core-0.3.53-py3-none-any.whl", hash = "sha256:d3c9d3635d516e26a4236b40da1e368e1e2cc66aa8a839625fb0bb30ee516e49", size = 83813 }, + { url = "https://files.pythonhosted.org/packages/f1/af/dee807deb019d3ad52c4d7957790b654cd3cf75dbe3144ff4f226aeae4b1/funcnodes_core-0.4.1-py3-none-any.whl", hash = "sha256:27f65a9dd4bf0c200e8d011b926df7daa69b82417a3803c7771fe7646434c100", size = 85483 }, ] [[package]]