def create_sample_params( params: Dict[str, Any]) -> Tuple[Sample, Optional[UUID], Optional[int]]: ''' Process the input from the create_sample API call and translate it into standard types. :param params: The unmarshalled JSON recieved from the API as part of the create_sample call. :returns: A tuple of the sample to save, the UUID of the sample for which a new version should be created or None if an entirely new sample should be created, and the previous version of the sample expected when saving a new version. :raises IllegalParameterError: if any of the arguments are illegal. ''' _check_params(params) if type(params.get('sample')) != dict: raise _IllegalParameterError( 'params must contain sample key that maps to a structure') s = params['sample'] if type(s.get('node_tree')) != list: raise _IllegalParameterError( 'sample node tree must be present and a list') if s.get('name') is not None and type(s.get('name')) != str: raise _IllegalParameterError('sample name must be omitted or a string') nodes = _check_nodes(s) id_ = get_id_from_object(s, ID, name='sample.id') pv = params.get('prior_version') if pv is not None and type(pv) != int: raise _IllegalParameterError( 'prior_version must be an integer if supplied') s = Sample(nodes, s.get('name')) return (s, id_, pv)
def validate_samples_params(params: Dict[str, Any]) -> List[Sample]: ''' Process the input from the validate_samples API call and translate it into standard types. :param params: The unmarshalled JSON recieved from the API as part of the create_sample call. :returns: A tuple of the sample to save, the UUID of the sample for which a new version should be created or None if an entirely new sample should be created, and the previous version of the sample expected when saving a new version. :raises IllegalParameterError: if any of the arguments are illegal. ''' _check_params(params) if type(params.get('samples')) != list or len(params.get('samples', [])) == 0: raise _IllegalParameterError('params must contain list of `samples`') samples = [] for s in params['samples']: if type(s.get('node_tree')) != list: raise _IllegalParameterError( 'sample node tree must be present and a list') if type(s.get('name')) != str or len(s.get('name')) <= 0: raise _IllegalParameterError( 'sample name must be included as non-empty string') nodes = _check_nodes(s) s = Sample(nodes, s.get('name')) samples.append(s) return samples
def create_sample_params( params: Dict[str, Any]) -> Tuple[Sample, Optional[UUID], Optional[int]]: ''' Process the input from the create_sample API call and translate it into standard types. :param params: The unmarshalled JSON recieved from the API as part of the create_sample call. :returns: A tuple of the sample to save, the UUID of the sample for which a new version should be created or None if an entirely new sample should be created, and the previous version of the sample expected when saving a new version. :raises IllegalParameterError: if any of the arguments are illegal. ''' _check_params(params) if type(params.get('sample')) != dict: raise _IllegalParameterError( 'params must contain sample key that maps to a structure') s = params['sample'] if type(s.get('node_tree')) != list: raise _IllegalParameterError( 'sample node tree must be present and a list') if s.get('name') is not None and type(s.get('name')) != str: raise _IllegalParameterError('sample name must be omitted or a string') nodes = [] for i, n in enumerate(s['node_tree']): if type(n) != dict: raise _IllegalParameterError( f'Node at index {i} is not a structure') if type(n.get('id')) != str: raise _IllegalParameterError( f'Node at index {i} must have an id key that maps to a string') try: type_ = _SubSampleType(n.get('type')) except ValueError: raise _IllegalParameterError( f'Node at index {i} has an invalid sample type: {n.get("type")}' ) if n.get('parent') and type(n.get('parent')) != str: raise _IllegalParameterError( f'Node at index {i} has a parent entry that is not a string') mc = _check_meta(n.get('meta_controlled'), i, 'controlled metadata') mu = _check_meta(n.get('meta_user'), i, 'user metadata') try: nodes.append( _SampleNode(n.get('id'), type_, n.get('parent'), mc, mu)) # already checked for the missing param error above, for id except _IllegalParameterError as e: raise _IllegalParameterError(f'Error for node at index {i}: ' + _cast(str, e.message)) from e id_ = get_id_from_object(s) pv = params.get('prior_version') if pv is not None and type(pv) != int: raise _IllegalParameterError( 'prior_version must be an integer if supplied') s = Sample(nodes, s.get('name')) return (s, id_, pv)