Source code for ngsildclient.api.contexts
#!/usr/bin/env python3
# Software Name: ngsildclient
# SPDX-FileCopyrightText: Copyright (c) 2021 Orange
# SPDX-License-Identifier: Apache 2.0
#
# This software is distributed under the Apache 2.0;
# see the NOTICE file for more details.
#
# Author: Fabien BATTELLO <fabien.battello@orange.com> et al.
from __future__ import annotations
from typing import TYPE_CHECKING, Optional
import re
import json
import logging
if TYPE_CHECKING:
from .client import Client
from ngsildclient.model.constants import CORE_CONTEXT
from .exceptions import rfc7807_error_handle
logger = logging.getLogger(__name__)
[docs]class Contexts:
"""A wrapper for the NGSI-LD API context endpoint."""
def __init__(self, client: Client, url: str):
self._client = client
self._session = client.session
self.url = url
@rfc7807_error_handle
def list(self, pattern: str = None) -> Optional[dict]:
r = self._session.get(f"{self.url}")
contexts = r.json()
if pattern is not None:
contexts = [x for x in contexts if re.search(pattern, x, re.IGNORECASE)]
return contexts
@rfc7807_error_handle
def get(self, ctx: str) -> dict:
r = self._session.get(f"{self.url}/{ctx}")
self._client.raise_for_status(r)
return r.json()
@rfc7807_error_handle
def _delete(self, ctx: str) -> bool:
r = self._session.delete(f"{self.url}/{ctx}")
self._client.raise_for_status(r)
return bool(r)
@rfc7807_error_handle
def delete(self, ctx: str, pattern: str = None) -> bool:
if pattern is None:
return self._delete(ctx)
deleted = False
for ctx in self.list():
if re.search(pattern, ctx, re.IGNORECASE):
deleted |= self.delete(ctx)
return deleted
@rfc7807_error_handle
def exists(self, ctx: str) -> bool:
r = self._session.get(f"{self.url}/{ctx}")
if r:
payload = r.json()
return "@context" in payload
return False
@rfc7807_error_handle
def cleanup(self) -> None:
"""Delete all contexts except the Core context."""
for ctx in self.list():
if ctx != CORE_CONTEXT:
self.delete(ctx)
@rfc7807_error_handle
def add(self, ctx: dict):
if not ctx.get("@context"):
raise ValueError("Expect a JSON object that has a top-level field named @context.")
r = self._session.post(f"{self.url}/", json=ctx)
self._client.raise_for_status(r)
@rfc7807_error_handle
def add_file(self, ctxfilename: str):
with open(ctxfilename, "r") as fp:
ctx = json.load(fp)
self.add(ctx)