Source code for latch.types.utils

import re
from pathlib import Path
from typing import Optional, Union
from urllib.parse import urlparse

import gql
from latch_sdk_gql.execute import execute


[docs]def is_valid_url(raw_url: Union[str, Path]) -> bool: """A valid URL (as a source or destination of a LatchFile) must: * contain a latch or s3 scheme * contain an absolute path """ try: parsed = urlparse(str(raw_url)) except ValueError: return False if parsed.scheme not in ("latch", "s3"): return False if parsed.path != "" and not parsed.path.startswith("/"): return False return True
is_absolute_node_path = re.compile(r"^(latch)?://(?P<node_id>\d+).node(/)?$") old_style_path = re.compile(r"^(?:(?P<account_root>account_root)|(?P<mount>mount))")
[docs]def format_path(path: str) -> str: match = is_absolute_node_path.match(path) if match is None: return path node_id = match.group("node_id") data = execute( gql.gql(""" query ldataGetPathQ($id: BigInt!) { ldataGetPath(argNodeId: $id) ldataOwner(argNodeId: $id) } """), {"id": node_id}, ) raw: Optional[str] = data["ldataGetPath"] if raw is None: return path parts = raw.split("/") match = old_style_path.match(raw) if match is None: return path if match["mount"] is not None: bucket = parts[1] key = "/".join(parts[2:]) return f"latch://{bucket}.mount/{key}" owner: Optional[str] = data["ldataOwner"] if owner is None: return path if match["account_root"] is not None: key = "/".join(parts[2:]) return f"latch://{owner}.account/{key}" return path