Source code for sdmx.urn

import re
from typing import Dict

from sdmx.model import PACKAGE, MaintainableArtefact

#: Regular expression for URNs.
URN = re.compile(
    r"urn:sdmx:org\.sdmx\.infomodel"
    r"\.(?P<package>[^\.]*)"
    r"\.(?P<class>[^=]*)=((?P<agency>[^:]*):)?"
    r"(?P<id>[^\(]*)(\((?P<version>[\d\.]*)\))?"
    r"(\.(?P<item_id>.*))?"
)

_BASE = (
    "urn:sdmx:org.sdmx.infomodel.{package}.{obj.__class__.__name__}="
    "{ma.maintainer.id}:{ma.id}({ma.version}){extra_id}"
)


[docs]def make(obj, maintainable_parent=None, strict=False): """Create an SDMX URN for `obj`. If `obj` is not :class:`.MaintainableArtefact`, then `maintainable_parent` must be supplied in order to construct the URN. """ if not isinstance(obj, MaintainableArtefact): ma = maintainable_parent or obj.get_scheme() extra_id = f".{obj.id}" else: ma = obj extra_id = "" if not isinstance(ma, MaintainableArtefact): raise ValueError( f"Neither {repr(obj)} nor {repr(maintainable_parent)} are maintainable" ) elif ma.maintainer is None: raise ValueError(f"Cannot construct URN for {repr(ma)} without maintainer") elif strict and ma.version is None: raise ValueError(f"Cannot construct URN for {repr(ma)} without version") return _BASE.format( package=PACKAGE[obj.__class__], obj=obj, ma=ma, extra_id=extra_id )
[docs]def match(value: str) -> Dict[str, str]: """Match :data:`URN` in `value`, returning a :class:`dict` with the match groups.""" try: match = URN.match(value) assert match is not None except AssertionError: raise ValueError(f"not a valid SDMX URN: {value}") else: return match.groupdict()