modular_api/helpers/utilities.py (54 lines of code) (raw):

import json from datetime import datetime from pathlib import Path from collections import deque from modular_api.helpers.exceptions import ModularApiBadRequestException from modular_api.helpers.log_helper import get_logger _LOG = get_logger(__name__) def parse_date(date): if date: try: return datetime.strptime(date, '%Y-%m-%d') except ValueError: raise ModularApiBadRequestException( f'Expected date format: yyyy-mm-dd. Given value: {date}') def validate_meta_keys(key: str) -> None: allowed_key_values = {*()} commands_base_path = Path(__file__).parent.parent.joinpath( 'web_service/commands_base.json' ) with open(commands_base_path, 'r') as file: data = json.load(file) queue = deque([data]) while queue: node = queue.popleft() if isinstance(node, dict): for k, v in node.items(): if k == 'name': allowed_key_values.add(v) else: queue.append(v) elif isinstance(node, list): queue.extend(node) if key not in allowed_key_values: raise ModularApiBadRequestException( f'Incorrect key name: \'{key}\'. Allowed values are only ' f'parameters names from installed components, like \'tenant, ' f'customer_id, region, etc.\'' ) def token_from_auth_header(header: str) -> str: """ Extracts token from bearer header """ return header.split(maxsplit=2)[-1] class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance return cls._instances[cls] def recursive_sort(item): if isinstance(item, dict): return {k: recursive_sort(v) for k, v in sorted(item.items())} if isinstance(item, list): return sorted([recursive_sort(v) for v in item]) else: return item