main - feat: Create initial structure

This commit is contained in:
Yoel Bassin 2025-04-26 15:47:56 +03:00
parent 43ad41495a
commit 377dab4ff9
7 changed files with 126 additions and 0 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"python.analysis.extraPaths": [
"./src"
]
}

35
main.py Normal file
View File

@ -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)

34
pyproject.toml Normal file
View File

@ -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"]

View File

View File

View File

@ -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()]

31
tests/test_platform.py Normal file
View File

@ -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"