main - feat: Create initial structure
This commit is contained in:
parent
43ad41495a
commit
377dab4ff9
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"python.analysis.extraPaths": [
|
||||||
|
"./src"
|
||||||
|
]
|
||||||
|
}
|
||||||
35
main.py
Normal file
35
main.py
Normal 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
34
pyproject.toml
Normal 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"]
|
||||||
0
src/gnuradio_mcp/__init__.py
Normal file
0
src/gnuradio_mcp/__init__.py
Normal file
0
src/gnuradio_mcp/middlewares/__init__.py
Normal file
0
src/gnuradio_mcp/middlewares/__init__.py
Normal file
21
src/gnuradio_mcp/middlewares/platform.py
Normal file
21
src/gnuradio_mcp/middlewares/platform.py
Normal 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
31
tests/test_platform.py
Normal 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"
|
||||||
Loading…
x
Reference in New Issue
Block a user