70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from kydcap.models.device_metadata import DeviceMetadata
|
|
from kydcap.config import DEVICE_METADATA_FILE
|
|
|
|
|
|
def write_device_metadata_to_file(metadata: DeviceMetadata, device_path: Path):
|
|
"""Write the device metadata to a JSON file in the specified directory."""
|
|
meta_file_path = device_path / "meta.json"
|
|
meta_file_path.write_text(metadata.json(indent=2))
|
|
|
|
|
|
def confirm_device_metadata(metadata: DeviceMetadata) -> bool:
|
|
"""Display device metadata for user confirmation."""
|
|
print(metadata.json(indent=2))
|
|
return input("Confirm device metadata? (y/n): ").strip().lower() == 'y'
|
|
|
|
|
|
def get_device_metadata_from_user() -> DeviceMetadata:
|
|
"""Prompt the user to enter device details and return a populated DeviceMetadata object."""
|
|
device_name = input("Device name: ")
|
|
device_short_name = device_name.lower().replace(" ", "-")
|
|
return DeviceMetadata(device_name=device_name, device_short_name=device_short_name)
|
|
|
|
|
|
def initialize_device_root_dir(device_name: str) -> Path:
|
|
"""Create and return the path for the device directory."""
|
|
device_path = Path.cwd() / device_name
|
|
device_path.mkdir(exist_ok=True)
|
|
return device_path
|
|
|
|
|
|
def write_metadata(metadata: BaseModel, device_name: str):
|
|
"""Write device metadata to a JSON file."""
|
|
meta_path = Path.cwd() / device_name / DEVICE_METADATA_FILE
|
|
meta_path.parent.mkdir(parents=True, exist_ok=True)
|
|
with meta_path.open('w') as f:
|
|
json.dump(metadata.dict(), f, indent=4)
|
|
|
|
|
|
def get_device_metadata(file_path: Path) -> DeviceMetadata | None:
|
|
"""Fetch device metadata from a JSON file."""
|
|
|
|
if dev_metadata_exists(file_path):
|
|
with file_path.open('r') as f:
|
|
device_metadata_json = json.load(f)
|
|
try:
|
|
device_metadata = DeviceMetadata.model_validate_json(device_metadata_json)
|
|
return device_metadata
|
|
except ValueError as e:
|
|
print(f"Validation error for device metadata: {e}")
|
|
else:
|
|
# TODO Decide what to do (e.g. search for file etc)
|
|
print(f"No device metadata at {file_path}")
|
|
return None
|
|
|
|
|
|
def search_device_metadata(filename=DEVICE_METADATA_FILE, start_dir=Path.cwd(), max_parents=3) -> Path:
|
|
pass # TODO
|
|
|
|
|
|
def dev_metadata_exists(file_path: Path) -> bool:
|
|
if file_path.is_file():
|
|
return True
|
|
else:
|
|
return False
|