Source code for grafanarmadillo.paths
"""Tools for manipulating path-like objects into references to Grafana objects or file-safe paths."""
from pathlib import Path
from typing import List, Sequence
from urllib.parse import quote_plus, unquote_plus
from grafanarmadillo.types import GrafanaPath, PathLike
[docs]class PathCodec:
"""Safely encode paths which may contain invalid characters, such as forward slashes."""
[docs] @staticmethod
def encode_grafana(path: GrafanaPath) -> Path:
"""Encode a GrafanaPath."""
if path.org:
return PathCodec.encode([path.org, path.folder, path.name])
else:
return PathCodec.encode([path.folder, path.name])
[docs] @staticmethod
def encode(segments: List[str]) -> Path:
"""Encode segments to a path."""
encoded_segments = [quote_plus(segment) for segment in segments]
return Path(*encoded_segments)
[docs] @staticmethod
def encode_segment(segment: str) -> str:
"""Encode a single segment."""
return quote_plus(segment)
[docs] @staticmethod
def try_parse(o: PathLike) -> GrafanaPath:
"""Try to decode a pathlike object."""
if isinstance(o, GrafanaPath):
return o
elif isinstance(o, list):
return PathCodec.parse_grafana(o)
else:
path = Path(o)
parts = path.parts[1:] if path.is_absolute() else path.parts
return PathCodec.parse_grafana(parts)
[docs] @staticmethod
def parse_grafana(parts: Sequence[str]) -> GrafanaPath:
"""Assemble segments into an orderly GrafanaPath."""
if len(parts) == 3:
return GrafanaPath(org=parts[0], folder=parts[1], name=parts[2])
elif len(parts) == 2:
return GrafanaPath(folder=parts[0], name=parts[1])
elif len(parts) == 1:
return GrafanaPath(folder="General", name=parts[0])
else:
raise ValueError(f"Grafana path has too many parts {parts=} len={len(parts)}")
[docs] @staticmethod
def decode(path: Path) -> List[str]:
"""Decode a path to segments."""
parts = path.parts[1:] if path.is_absolute() else path.parts
decoded_segments = [unquote_plus(segment) for segment in parts]
return decoded_segments
[docs] @staticmethod
def decode_segment(segment: str) -> str:
"""Decode a single segment."""
return unquote_plus(segment)