main - feat: Implement default block naming

This commit is contained in:
Yoel Bassin 2025-04-26 22:05:06 +03:00
parent 185e68f809
commit 73bf514fc1
4 changed files with 53 additions and 3 deletions

View File

@ -1,9 +1,12 @@
from __future__ import annotations from __future__ import annotations
from typing import Optional
from gnuradio.grc.core.FlowGraph import FlowGraph from gnuradio.grc.core.FlowGraph import FlowGraph
from gnuradio_mcp.middlewares.block import BlockMiddleware from gnuradio_mcp.middlewares.block import BlockMiddleware
from gnuradio_mcp.models import BlockModel from gnuradio_mcp.models import BlockModel
from gnuradio_mcp.utils import get_unique_id
class FlowGraphMiddleware: class FlowGraphMiddleware:
@ -17,9 +20,11 @@ class FlowGraphMiddleware:
for block in self._flowgraph.blocks for block in self._flowgraph.blocks
] ]
def add_block(self, block_type: str, block_name: str) -> None: def add_block(self, block_type: str, block_name: Optional[str] = None) -> str:
block_name = block_name or get_unique_id(self._flowgraph.blocks)
block = self._flowgraph.new_block(block_type) block = self._flowgraph.new_block(block_type)
block.params["id"].set_value(block_name) block.params["id"].set_value(block_name)
return block_name
def remove_block(self, block_name: str) -> None: def remove_block(self, block_name: str) -> None:
block = self._flowgraph.get_block(block_name) block = self._flowgraph.get_block(block_name)

10
src/gnuradio_mcp/utils.py Normal file
View File

@ -0,0 +1,10 @@
from itertools import count
def get_unique_id(flowgraph_blocks, base_id=""):
block_ids = set(b.name for b in flowgraph_blocks)
for index in count():
block_id = "{}_{}".format(base_id, index)
if block_id not in block_ids:
break
return block_id

View File

@ -17,8 +17,8 @@ def flowgraph_middleware(platform: Platform):
@pytest.fixture @pytest.fixture
def block(flowgraph_middleware: FlowGraphMiddleware, block_key: str): def block(flowgraph_middleware: FlowGraphMiddleware, block_key: str):
flowgraph_middleware.add_block(block_key, block_key) block_name = flowgraph_middleware.add_block(block_key)
return flowgraph_middleware._flowgraph.get_block(block_key) return flowgraph_middleware._flowgraph.get_block(block_name)
def test_block_middleware_params(block: Block): def test_block_middleware_params(block: Block):

View File

@ -50,3 +50,38 @@ def test_flowgraph_initial_state(
initial_blocks: list[BlockModel], initial_blocks: list[BlockModel],
): ):
assert flowgraph_middleware.blocks == initial_blocks assert flowgraph_middleware.blocks == initial_blocks
def test_block_naming(flowgraph_middleware: FlowGraphMiddleware, block_key: str):
# Explicit name
explicit_name = "my_custom_block_name"
flowgraph_middleware.add_block(block_key, explicit_name)
block = flowgraph_middleware._flowgraph.get_block(explicit_name)
assert block.params["id"].get_value() == explicit_name
# Remove for clean state
flowgraph_middleware._flowgraph.remove_element(block)
# Implicit name (should use get_unique_id logic)
flowgraph_middleware.add_block(block_key)
# The last block added should be the last in the blocks list
last_block = flowgraph_middleware._flowgraph.blocks[-1]
# The id param should match the block's name
assert last_block.params["id"].get_value() == last_block.name
# Remove for clean state
flowgraph_middleware._flowgraph.remove_element(last_block)
def test_block_unique_names_for_same_type(
flowgraph_middleware: FlowGraphMiddleware, block_key: str
):
# Add two blocks of the same type without explicit names
flowgraph_middleware.add_block(block_key)
first_block = flowgraph_middleware._flowgraph.blocks[-1]
flowgraph_middleware.add_block(block_key)
second_block = flowgraph_middleware._flowgraph.blocks[-1]
# They should have different names
assert first_block.name != second_block.name
assert first_block.params["id"].get_value() != second_block.params["id"].get_value()
# Clean up
flowgraph_middleware._flowgraph.remove_element(first_block)
flowgraph_middleware._flowgraph.remove_element(second_block)