Source code for datamasque.client.rulesets
import logging
from datamasque.client.base import BaseClient
from datamasque.client.exceptions import DataMasqueException
from datamasque.client.models.ruleset import Ruleset, RulesetId
from datamasque.client.models.status import ValidationStatus
logger = logging.getLogger(__name__)
[docs]
class RulesetClient(BaseClient):
"""Ruleset CRUD API methods. Mixed into `DataMasqueClient`."""
[docs]
def list_rulesets(self) -> list[Ruleset]:
"""Returns all rulesets configured on the server."""
response = self.make_request("GET", "/api/v2/rulesets/")
return [Ruleset.model_validate(payload) for payload in response.json()]
[docs]
def create_or_update_ruleset(self, ruleset: Ruleset) -> Ruleset:
"""
Creates or updates a ruleset.
Populates the given ruleset's `id` and `is_valid` fields from the server response,
and returns the same ruleset instance for convenience.
"""
data = ruleset.model_dump(exclude_none=True, by_alias=True, mode="json")
response = self.make_request("POST", "/api/rulesets/", data=data, params={"upsert": "true"})
response_data = response.json()
ruleset.id = RulesetId(response_data["id"])
is_valid = response_data.get("is_valid")
if is_valid is not None:
ruleset.is_valid = ValidationStatus(is_valid)
if response.status_code == 201:
logger.info('Creation of ruleset "%s" successful', ruleset.name)
elif response.status_code == 200:
logger.debug('Update of ruleset "%s" successful', ruleset.name)
return ruleset
[docs]
def delete_ruleset_by_id_if_exists(self, ruleset_id: RulesetId) -> None:
"""Deletes the ruleset with the given ID. No-op if the ruleset does not exist."""
self._delete_if_exists(f"/api/rulesets/{ruleset_id}/")
[docs]
def delete_ruleset_by_name_if_exists(self, ruleset_name: str) -> None:
"""Deletes the ruleset with the given name. No-op if the ruleset does not exist."""
all_rulesets = self.list_rulesets()
rulesets_matching_name = [ruleset for ruleset in all_rulesets if ruleset.name == ruleset_name]
for ruleset in rulesets_matching_name:
if ruleset.id is None:
raise DataMasqueException(f'Server returned a ruleset named "{ruleset.name}" without an `id`.')
self.delete_ruleset_by_id_if_exists(ruleset.id)