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, RulesetType
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`, `is_valid`, `validation_errors`,
and `git` 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"})
created = Ruleset.model_validate(response.json())
ruleset.id = created.id
ruleset.is_valid = created.is_valid
ruleset.validation_errors = created.validation_errors
ruleset.git = created.git
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, ruleset_type: RulesetType) -> None:
"""
Deletes the ruleset with the given name and type.
Ruleset names are unique per type, so a type is required to identify a single ruleset.
No-op if no such ruleset exists.
"""
matching = [
ruleset
for ruleset in self.list_rulesets()
if ruleset.name == ruleset_name and ruleset.ruleset_type is ruleset_type
]
for ruleset in matching:
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)