def validate(self): as_token = self.get_token(Token.AS) if as_token: if as_token is not self.tokens[-2]: self.errors += ("EXCEPT's AS marker must be second to last.", ) var = self.tokens[-1].value if not is_scalar_assign(var): self.errors += (f"EXCEPT's AS variable '{var}' is invalid.", )
def validate(self, context): as_token = self.get_token(Token.AS) if as_token: variables = self.get_tokens(Token.VARIABLE) if not variables: self.errors += ("EXCEPT's AS requires variable.",) elif len(variables) > 1: self.errors += ("EXCEPT's AS accepts only one variable.",) elif not is_scalar_assign(variables[0].value): self.errors += (f"EXCEPT's AS variable '{variables[0].value}' is invalid.",)
def validate(self): if not self.variables: self._add_error('no loop variables') if not self.flavor: self._add_error("no 'IN' or other valid separator") else: for var in self.variables: if not is_scalar_assign(var): self._add_error("invalid loop variable '%s'" % var) if not self.values: self._add_error('no loop values')
def _validate_arg(self, arg): arg, default = split_from_equals(arg) if not (is_assign(arg) or arg == '@{}'): self._report_error("Invalid argument syntax '%s'." % arg) if default is None: return arg if not is_scalar_assign(arg): typ = 'list' if arg[0] == '@' else 'dictionary' self._report_error("Only normal arguments accept default values, " "%s arguments like '%s' do not." % (typ, arg)) return arg, default
def _validate(self, data): if not data.ended: raise DataError("FOR loop has no closing 'END'.") if not data.variables: raise DataError('FOR loop has no loop variables.') for var in data.variables: if not is_scalar_assign(var): raise DataError("Invalid FOR loop variable '%s'." % var) if not data.values: raise DataError('FOR loop has no loop values.') if not data.keywords: raise DataError('FOR loop contains no keywords.')
def test_is_scalar_assign(self): for ok in SCALARS: assert is_scalar_assign(ok) assert is_scalar_assign(ok + '=', allow_assign_mark=True) assert is_scalar_assign(ok + ' =', allow_assign_mark=True) assert not is_scalar_assign(ok + '[item]') assert not is_scalar_assign(' ' + ok) for nok in NOK_ASSIGNS + LISTS + DICTS: assert not is_scalar_assign(nok)
def test_is_scalar_assign(self): for ok in SCALARS: assert is_scalar_assign(ok) assert search_variable(ok).is_scalar_assign() assert is_scalar_assign(ok + '=', allow_assign_mark=True) assert is_scalar_assign(ok + ' =', allow_assign_mark=True) assert not is_scalar_assign(ok + '[item]') assert not is_scalar_assign(' ' + ok) for nok in NOK_ASSIGNS + LISTS + DICTS: assert not is_scalar_assign(nok) assert not search_variable(nok, ignore_errors=True).is_scalar_assign()
def _validate(self): errors = [] if not self.variables: errors.append('No loop variables.') if not self.flavor: errors.append("No 'IN' or other valid separator.") else: for var in self.variables: if not is_scalar_assign(var): errors.append("Invalid loop variable '%s'." % var) if not self.values: errors.append('No loop values.') if not self.body: errors.append('Empty body.') if not self.end: errors.append("No closing 'END'.") return errors
def _validate(self, data): # TODO: Remove header and end deprecations in RF 3.3! if data._header != 'FOR': self._deprecated( "For loop header '%s' is deprecated. " "Use 'FOR' instead." % data._header, data) if data._end is None: raise DataError("For loop has no closing 'END'.") if data._end != 'END': self._deprecated( "Marking for loop body with '\\' is deprecated. " "Remove markers and use 'END' instead.", data) if not data.variables: raise DataError('FOR loop has no loop variables.') for var in data.variables: if not is_scalar_assign(var): raise DataError("Invalid FOR loop variable '%s'." % var) if not data.values: raise DataError('FOR loop has no loop values.') if not data.keywords: raise DataError('FOR loop contains no keywords.')
def visit_ForHeader(self, node): import robot.parsing.lexer.tokens as tokens if not node.variables: self.append_error(node, 'FOR loop has no loop variables.') else: for var in [ t for t in node.tokens if t.type in tokens.Token.VARIABLE ]: if not is_scalar_assign(var.value): self.append_error( var, f"FOR loop has invalid loop variable '{var.value}'.") if not node.flavor: self.append_error( node, "FOR loop has no 'IN' or other valid separator.") else: if not node.values: self.append_error(node, 'FOR loop has no loop values.') self.generic_visit(node)
def _format_arg(self, arg): if not is_scalar_assign(arg): self._raise_invalid_spec("Invalid argument syntax '%s'." % arg) return arg[2:-1]