Source code for vulyk.cli.batches

# -*- coding: utf-8 -*-
"""Package contains CLI tools related to managing batches of tasks."""

from copy import deepcopy
from typing import Dict, List, Optional

import click

from vulyk.models.task_types import AbstractTaskType
from vulyk.models.tasks import Batch


[docs]def add_batch(batch_id: str, count: int, task_type: AbstractTaskType, default_batch: str, batch_meta: Optional[Dict] = None) -> None: """ Updates or creates new batch after loading new dataset. Only default batch may be extended. :param batch_id: Name of the batch :type batch_id: str :param count: Number of tasks to load :type count: int :param task_type: Type of tasks loaded into the batch :type task_type: AbstractTaskType :param default_batch: Name of the default batch :type default_batch: str :param batch_meta: User params to override default batch meta :type batch_meta: Optional[Dict] :raise: click.BadParameter """ task_type_name = task_type.type_name try: batch = Batch.objects.get(id=batch_id) if batch.task_type != task_type_name: raise click.BadParameter( 'Batch {batch} doesn\'t support {task_type_name}'.format( batch=batch_id, task_type_name=task_type_name)) elif batch_id != default_batch: raise click.BadParameter( 'Only default batch could be extended') batch.update(inc__tasks_count=count) except Batch.DoesNotExist: meta = {} task_type_meta = deepcopy(task_type.task_type_meta) if batch_meta: for m_key, m_val in batch_meta.items(): if m_key not in task_type.task_type_meta: raise click.BadParameter( 'Meta key {} doesn\'t exist in task type'.format(m_key) ) try: cast_to = type(task_type.task_type_meta[m_key]) if cast_to != bool: meta[m_key] = cast_to(m_val) else: meta[m_key] = m_val.lower() in ('true', '1') except ValueError: raise click.BadParameter( 'Value for meta key {} cannot be converted ' 'to type {}'.format(m_key, cast_to) ) task_type_meta.update(meta) Batch.objects.create( id=batch_id, task_type=task_type_name, tasks_count=count, batch_meta=task_type_meta )
[docs]def validate_batch(ctx, param: str, value: str, default_batch: str) -> str: """ Refuses your attempts to add tasks to existing batch (except 'default') :param ctx: Click context :param param: Name of parameter (`batch`) :type param: str :param value: Value of `batch` parameter :type value: str :param default_batch: Name of the default batch :type default_batch: str :return: the value if is valid :rtype: str :raise: click.BadParameter """ if value != default_batch and value in Batch.objects.scalar('id'): raise click.BadParameter( 'Batch with id {id} already exists'.format(id=value)) else: return value
[docs]def batches_list() -> List[str]: """ :return: List of batches IDs to validate CLI input :rtype: List[str] """ return list(Batch.objects.scalar('id'))