We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/basicmachines-co/basic-memory'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
"""Shared helpers and constants for schema integration tests.
Separated from conftest.py so they can be explicitly imported by test modules.
Conftest fixtures are auto-injected by pytest and don't need explicit import.
"""
import re
from pathlib import Path
import yaml
from basic_memory.schema.inference import ObservationData, RelationData
# --- Fixture Paths ---
FIXTURES_ROOT = Path(__file__).parent.parent / "fixtures" / "schema"
SCHEMAS_DIR = FIXTURES_ROOT / "schemas"
VALID_DIR = FIXTURES_ROOT / "valid"
WARNINGS_DIR = FIXTURES_ROOT / "warnings"
EDGE_CASES_DIR = FIXTURES_ROOT / "edge-cases"
INFERENCE_DIR = FIXTURES_ROOT / "inference" / "people"
DRIFT_SCHEMA_DIR = FIXTURES_ROOT / "drift" / "schema"
DRIFT_PEOPLE_DIR = FIXTURES_ROOT / "drift" / "people"
# --- Frontmatter Parsing ---
def parse_frontmatter(filepath: Path) -> dict:
"""Extract YAML frontmatter from a markdown file."""
text = filepath.read_text(encoding="utf-8")
match = re.match(r"^---\n(.*?)\n---", text, re.DOTALL)
if not match:
return {}
return yaml.safe_load(match.group(1)) or {}
def parse_observations(filepath: Path) -> list[ObservationData]:
"""Extract ObservationData from a markdown file.
Parses lines matching: - [category] content
"""
text = filepath.read_text(encoding="utf-8")
pattern = re.compile(r"^- \[([^\]]+)\] (.+)$", re.MULTILINE)
return [ObservationData(m.group(1), m.group(2)) for m in pattern.finditer(text)]
def parse_relations(filepath: Path) -> list[RelationData]:
"""Extract RelationData from a markdown file.
Parses lines matching: - relation_type [[Target]]
Only matches lines under a ## Relations heading.
"""
text = filepath.read_text(encoding="utf-8")
relations_match = re.search(r"## Relations\n(.*?)(?=\n## |\Z)", text, re.DOTALL)
if not relations_match:
return []
relations_text = relations_match.group(1)
pattern = re.compile(r"^- (\S+) \[\[([^\]]+)\]\]$", re.MULTILINE)
return [RelationData(m.group(1), m.group(2)) for m in pattern.finditer(relations_text)]