## What ##
A simple library for building runnable tree structures. Trees are built using Nodes, which
contain code to be run.
Use:
```
# Declare your nodes
root_node = Node(...)
child_node1 = Node(...)
child_node2 = Node(...)
grandchild_node1 = Node(...)
# Set the layout
nodes = {
root_node: {
child_node1: None,
child_node2: [grandchild_node1],
}
}
# Use the '|' operator to connect the nodes
executor = AsyncTreeExecutor(logger=logger)
tree = executor | nodes
result = await tree.run()
```
Powered by `asyncio` & `instructor`!
- `asyncio`: https://docs.python.org/3/library/asyncio.html
- `instructor`: https://python.useinstructor.com/
## How ##
- You have a tree of interconected `Nodes` and an `asyncio.Queue()`
- Upon each Node's execution, it queues its children up next
- Workers stop when they find a `None` in the queue
- ⚠️ Be careful with UnionNodes, they can cause invisible deadlocks. ⚠️
## Axioms ##
1) A tree can only have one root node.
2) Nodes can be run concurrently.
3) Dictionary outputs are passed as kwargs to children. All other types are passed as args.
4) UnionNodes can never be direct children of PickerNodes.
## Zen ##
1. Follow established names: a Node is a Node, not a "Leaf".
2. Syntax sugar is sweet in moderation.
3. Give the programmer granular control.
## During Development ##
- `pip install -e .` to install on your environment
- `pytest` to run tests, add `-s` flag for tests to run `print` statements
## Extras ##
[![Pydantic is All You Need](https://i3.ytimg.com/vi/yj-wSRJwrrc/hqdefault.jpg)](https://www.youtube.com/embed/yj-wSRJwrrc)
Raw data
{
"_id": null,
"home_page": "https://github.com/HappyLoop/grafo",
"name": "grafo",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": null,
"author": "HappyLoop @paulomtts",
"author_email": "dev@happyloop.com",
"download_url": "https://files.pythonhosted.org/packages/22/20/ed3cd4fbbed994d5354d4d47ad57ed79c19bbe3aef3d206ddc5d4031da4f/grafo-0.1.5.tar.gz",
"platform": null,
"description": "## What ##\nA simple library for building runnable tree structures. Trees are built using Nodes, which\ncontain code to be run.\n\nUse:\n\n```\n# Declare your nodes\nroot_node = Node(...)\nchild_node1 = Node(...)\nchild_node2 = Node(...)\ngrandchild_node1 = Node(...)\n\n# Set the layout\nnodes = {\n root_node: {\n child_node1: None,\n child_node2: [grandchild_node1],\n }\n}\n\n# Use the '|' operator to connect the nodes\nexecutor = AsyncTreeExecutor(logger=logger)\ntree = executor | nodes\nresult = await tree.run()\n```\n\nPowered by `asyncio` & `instructor`!\n\n- `asyncio`: https://docs.python.org/3/library/asyncio.html\n- `instructor`: https://python.useinstructor.com/\n\n## How ##\n- You have a tree of interconected `Nodes` and an `asyncio.Queue()`\n- Upon each Node's execution, it queues its children up next\n- Workers stop when they find a `None` in the queue\n- \u26a0\ufe0f Be careful with UnionNodes, they can cause invisible deadlocks. \u26a0\ufe0f\n\n## Axioms ##\n1) A tree can only have one root node.\n2) Nodes can be run concurrently.\n3) Dictionary outputs are passed as kwargs to children. All other types are passed as args.\n4) UnionNodes can never be direct children of PickerNodes.\n\n## Zen ##\n1. Follow established names: a Node is a Node, not a \"Leaf\".\n2. Syntax sugar is sweet in moderation.\n3. Give the programmer granular control.\n\n## During Development ##\n- `pip install -e .` to install on your environment\n- `pytest` to run tests, add `-s` flag for tests to run `print` statements\n\n## Extras ##\n[![Pydantic is All You Need](https://i3.ytimg.com/vi/yj-wSRJwrrc/hqdefault.jpg)](https://www.youtube.com/embed/yj-wSRJwrrc)\n",
"bugtrack_url": null,
"license": null,
"summary": "A library for building runnable asynchronous trees",
"version": "0.1.5",
"project_urls": {
"Homepage": "https://github.com/HappyLoop/grafo"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "032c1fe9c69298e8940bea550ff499f657886c00b53cc5dbe56acbc3c03d34ad",
"md5": "7f2ad220014224ea1158e81240acddd1",
"sha256": "f7348d1eac69b4d5b6b42d2f3edd7397fabd0280ac916776fb1a5d0afb92aed5"
},
"downloads": -1,
"filename": "grafo-0.1.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7f2ad220014224ea1158e81240acddd1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 10954,
"upload_time": "2024-06-12T17:02:13",
"upload_time_iso_8601": "2024-06-12T17:02:13.678000Z",
"url": "https://files.pythonhosted.org/packages/03/2c/1fe9c69298e8940bea550ff499f657886c00b53cc5dbe56acbc3c03d34ad/grafo-0.1.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2220ed3cd4fbbed994d5354d4d47ad57ed79c19bbe3aef3d206ddc5d4031da4f",
"md5": "c975377e9e5938c44234b261ba8eafaf",
"sha256": "57a397656ced1a3b21ab798aec30e108111a7f742c822e1b8ca5283430d5c517"
},
"downloads": -1,
"filename": "grafo-0.1.5.tar.gz",
"has_sig": false,
"md5_digest": "c975377e9e5938c44234b261ba8eafaf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 13597,
"upload_time": "2024-06-12T17:02:15",
"upload_time_iso_8601": "2024-06-12T17:02:15.593080Z",
"url": "https://files.pythonhosted.org/packages/22/20/ed3cd4fbbed994d5354d4d47ad57ed79c19bbe3aef3d206ddc5d4031da4f/grafo-0.1.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-06-12 17:02:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "HappyLoop",
"github_project": "grafo",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "grafo"
}