def get_spec( self, name: str, iotype: str, is_flag: bool, is_list: bool, is_context: bool, arg_format: str, ): """ Checks if the value is param ref and validates it. returns: ParamSpec or None raises: ValidationError """ if not self.is_literal and not ( self.is_join_ref and isinstance(self.value, Mapping) ): # value validation is the same for search and ref value_parts = PARAM_REGEX.search(self.value) if value_parts: value_parts = value_parts.group(1) else: value_parts = self.value value_parts = [s.strip() for s in value_parts.split(".")] if len(value_parts) > 3: raise ValidationError( "Could not parse value `{}` for param `{}`.".format( self.value, name ) ) if ( len(value_parts) == 1 and value_parts[0] not in contexts_sections.CONTEXTS ): raise ValidationError( "Received an invalid value `{}` for param `{}`. " "Value must be one of `{}`".format( self.value, name, contexts_sections.CONTEXTS ) ) # Check the case of current DAG, it should not allow to use outputs if ( len(value_parts) == 1 and self.is_dag_ref and value_parts[0] == contexts_sections.OUTPUTS ): raise ValidationError( "Received an invalid value `{}` for param `{}`. " "You can not use `{}` of current dag".format( self.value, name, contexts_sections.OUTPUTS ) ) if ( len(value_parts) == 2 and value_parts[0] not in contexts_sections.CONTEXTS_WITH_NESTING ): raise ValidationError( "Received an invalid value `{}` for param `{}`. " "Value `{}` must be one of `{}`".format( self.value, name, value_parts[0], contexts_sections.CONTEXTS_WITH_NESTING, ) ) if len(value_parts) == 3 and value_parts[0] != contexts_sections.ARTIFACTS: raise ValidationError( "Received an invalid value `{}` for param `{}`. " "Value `{}` must can only be equal to `{}`".format( self.value, name, value_parts[0], contexts_sections.ARTIFACTS ) ) if self.is_ref: if self.is_join_ref: if not is_context and not is_list and iotype != types.ARTIFACTS: raise ValidationError( "Param `{}` has a an input type `{}`, " "it does not expect a list of values from the join. " "You should either pass a single value or add `isList` " "to you IO definition".format( name, iotype, ) ) else: contexts_refs.validate_ref(ref=self.ref, name=name) return ParamSpec( name=name, type=iotype, param=self, is_flag=is_flag, is_list=is_list, is_context=is_context, arg_format=arg_format, )