def test_is_dict_variable(self): for ok in DICTS: assert is_dict_variable(ok) assert not is_dict_variable(ok + '[item]') assert not is_dict_variable(' ' + ok) assert not is_dict_variable(ok + '=') for nok in NOKS + SCALARS + LISTS: assert not is_dict_variable(nok)
def test_is_dict_variable(self): for ok in DICTS: assert is_dict_variable(ok) assert search_variable(ok).is_dict_variable() assert is_dict_variable(ok + '[item]') assert not is_dict_variable(' ' + ok) assert not is_dict_variable(ok + '=') for nok in NOKS + SCALARS + LISTS: assert not is_dict_variable(nok) assert not search_variable(nok, ignore_errors=True).is_dict_variable()
def _is_dict_iteration(self, values): for item in values: if is_dict_variable(item): return True if split_from_equals(item)[1] is None: return False return True
def validate(self, positional, named, dryrun=False): named = set(name for name, value in named) if dryrun and (any(is_list_variable(arg) for arg in positional) or any(is_dict_variable(arg) for arg in named)): return self._validate_no_multiple_values(positional, named, self._argspec) self._validate_no_positional_only_as_named(named, self._argspec) self._validate_positional_limits(positional, named, self._argspec) self._validate_no_mandatory_missing(positional, named, self._argspec) self._validate_no_named_only_missing(named, self._argspec) self._validate_no_extra_named(named, self._argspec)
def resolve(self, arguments, variables=None): positional = [] named = [] for arg in arguments: if is_dict_variable(arg): named.append(arg) elif self._is_named(arg, named, variables): named.append(split_from_equals(arg)) elif named: self._raise_positional_after_named() else: positional.append(arg) return positional, named
def _is_dict_iteration(self, values): all_name_value = True for item in values: if is_dict_variable(item): return True if split_from_equals(item)[1] is None: all_name_value = False if all_name_value: name, value = split_from_equals(values[0]) logger.warn( "FOR loop iteration over values that are all in 'name=value' " "format like '%s' is deprecated. In the future this syntax " "will mean iterating over names and values separately like " "when iterating over '&{dict} variables. Escape at least one " "of the values like '%s\\=%s' to use normal FOR loop " "iteration and to disable this warning." % (values[0], name, value)) return False
def _resolve_dict_values(self, values): result = OrderedDict() replace_scalar = self._context.variables.replace_scalar for item in values: if is_dict_variable(item): result.update(replace_scalar(item)) else: key, value = split_from_equals(item) if value is None: raise DataError( "Invalid FOR loop value '%s'. When iterating over " "dictionaries, values must be '&{dict}' variables " "or use 'key=value' syntax." % item) try: result[replace_scalar(key)] = replace_scalar(value) except TypeError: raise DataError("Invalid dictionary item '%s': %s" % (item, get_error_message())) return result.items()
def _is_valid_dict_item(self, item): name, value = split_from_equals(item) return value is not None or is_dict_variable(item)