From 377dab4ff999e1503f03eec66cbc5de0274060d7 Mon Sep 17 00:00:00 2001 From: Yoel Bassin Date: Sat, 26 Apr 2025 15:47:56 +0300 Subject: [PATCH] main - feat: Create initial structure --- .vscode/settings.json | 5 ++++ main.py | 35 ++++++++++++++++++++++++ pyproject.toml | 34 +++++++++++++++++++++++ src/gnuradio_mcp/__init__.py | 0 src/gnuradio_mcp/middlewares/__init__.py | 0 src/gnuradio_mcp/middlewares/platform.py | 21 ++++++++++++++ tests/test_platform.py | 31 +++++++++++++++++++++ 7 files changed, 126 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 main.py create mode 100644 pyproject.toml create mode 100644 src/gnuradio_mcp/__init__.py create mode 100644 src/gnuradio_mcp/middlewares/__init__.py create mode 100644 src/gnuradio_mcp/middlewares/platform.py create mode 100644 tests/test_platform.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..af7446d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "python.analysis.extraPaths": [ + "./src" + ] +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..e02528a --- /dev/null +++ b/main.py @@ -0,0 +1,35 @@ +import logging +import logging.handlers +import platform +import sys +from pathlib import Path + + +# Load GNU Radio +try: + from gnuradio import gr +except ImportError as ex: + # Throw a new exception with more information + print( + "Cannot find GNU Radio! (Have you sourced the environment file?)", + file=sys.stderr, + ) + # Throw the new exception + raise Exception("Cannot find GNU Radio!") from None + +from gnuradio.grc.core.platform import Platform +from gnuradio.grc.core.FlowGraph import FlowGraph + +platform = Platform( + version=gr.version(), + version_parts=(gr.major_version(), gr.api_version(), gr.minor_version()), + prefs=gr.prefs(), + # install_prefix=gr.prefix() +) +platform.build_library() + +from gnuradio_mcp.middlewares.platform import PlatformMiddleware + +platform_middleware = PlatformMiddleware(platform) + +print(platform_middleware.blocks) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..82ef52c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,34 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "gnuradio-mcp" +version = "0.1.0" +description = "A FastMCP server for gnuradio." +requires-python = ">=3.13" +dependencies = [ + "pyYAML", + "mako", + "pygobject", + "numpy", + "jsonschema", +] + +[project.optional-dependencies] +dev = [ + "pytest >= 7.0", +] + +[tool.ruff] +line-length = 88 + +[tool.ruff.lint] +select = ["E", "F", "W", "I"] # Enable basic flake8 rules + isort + +[tool.ruff.format] +quote-style = "double" + +[tool.pytest.ini_options] +# Tell pytest where to find the package +pythonpath = ["src"] diff --git a/src/gnuradio_mcp/__init__.py b/src/gnuradio_mcp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gnuradio_mcp/middlewares/__init__.py b/src/gnuradio_mcp/middlewares/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gnuradio_mcp/middlewares/platform.py b/src/gnuradio_mcp/middlewares/platform.py new file mode 100644 index 0000000..fb2a63a --- /dev/null +++ b/src/gnuradio_mcp/middlewares/platform.py @@ -0,0 +1,21 @@ +from typing import List +from gnuradio.grc.core.platform import Platform +from pydantic import BaseModel + +from gnuradio.grc.core.blocks.block import Block + +class BlockModel(BaseModel): + label: str + key: str + + @classmethod + def from_block(cls, block: Block) -> "BlockModel": + return cls(label=block.label, key=block.key) + +class PlatformMiddleware: + def __init__(self, platform: Platform): + self._platform = platform + + @property + def blocks(self) -> List[BlockModel]: + return [BlockModel.from_block(block) for block in self._platform.blocks.values()] diff --git a/tests/test_platform.py b/tests/test_platform.py new file mode 100644 index 0000000..5f4d4f3 --- /dev/null +++ b/tests/test_platform.py @@ -0,0 +1,31 @@ +import pytest +from gnuradio_mcp.middlewares.platform import BlockModel, PlatformMiddleware + +class MockBlock: + def __init__(self, label, key): + self.label = label + self.key = key + +class MockPlatform: + def __init__(self, blocks): + self.blocks = {block.key: block for block in blocks} + +def test_block_model_from_block(): + block = MockBlock(label="Test Block", key="test_key") + model = BlockModel.from_block(block) + assert model.label == "Test Block" + assert model.key == "test_key" + +def test_platform_middleware_blocks(): + blocks = [ + MockBlock(label="Block A", key="a"), + MockBlock(label="Block B", key="b"), + ] + platform = MockPlatform(blocks) + middleware = PlatformMiddleware(platform) + block_models = middleware.blocks + assert len(block_models) == 2 + assert block_models[0].label == "Block A" + assert block_models[0].key == "a" + assert block_models[1].label == "Block B" + assert block_models[1].key == "b"