def matches(self, item, mismatch_description=None): """Return whether the item is a valid to-many relationship.""" if mismatch_description is None: mismatch_description = StringDescription() if "data" not in item: mismatch_description.append('missing key "data"') return False if not isinstance(item["data"], list): mismatch_description.append( "to-many relationship is not a `list`\n " f"got: `{item.__class__.__name__}`") return False if not self.optional and not item["data"]: mismatch_description.append( "non-optional to-many relationship is ") mismatch_description.append_description_of(item["data"]) return False for index, data in enumerate(item["data"]): if not super().matches(data): mismatch_description.append( f"to-many relationship at index {index}" " does not match. Failed because: ") super().matches(data, mismatch_description) return False return True
def matches(self, item, mismatch_description=None): """Return whether the item is a valid to-one relationship.""" if mismatch_description is None: mismatch_description = StringDescription() if "data" not in item: mismatch_description.append('missing key "data"') return False if item["data"] is None: if self.optional: return True mismatch_description.append("non-optional to-one relationship is ") mismatch_description.append_description_of(item["data"]) return False return super().matches(item["data"], mismatch_description)
def _matches(self, item): if not (isinstance(item, list) or isinstance(item, tuple)): self.messages.append( f'Can\'t perform ListSorted matcher on {type(item)} object.') pairs = [(item[i], item[i + 1]) for i in range(len(item) - 1)] for i, (left, right) in enumerate(pairs): matcher = self.pair_matcher(self.criteria(right)) if not matcher.matches(self.criteria(left)): description = StringDescription() matcher.describe_to(description) description.append_text(' expected, but ') matcher.describe_mismatch(self.criteria(left), description) description.append(f'. items indexes are {i}, and {i + 1}') self.messages.append(str(description)) return False return True
def matches(self, item, mismatch_description=None): """Return whether the item is a json:api document.""" if mismatch_description is None: mismatch_description = StringDescription() if "data" not in item: mismatch_description.append('missing key "data"') return False if not self.optional and not item["data"]: mismatch_description.append('non-optional "data" is ') mismatch_description.append_description_of(item["data"]) return False if self.many: if not isinstance(item["data"], list): mismatch_description.append( f'"data" is not a `list`\n got: `{item.__class__.__name__}`' ) return False for index, data in enumerate(item["data"]): if not self._match_resource( data, mismatch_description, index=index): return False elif not self._match_resource(item["data"], mismatch_description): return False return self._matches_includes(item, mismatch_description)
def test_description_append_invalid_input(): desc = StringDescription() desc.append(chr(239))
def test_description_append_valid_input(valid_input): desc = StringDescription() desc.append(valid_input) str(desc)
def matches(self, item, mismatch_description=None): """Return whether the item is a resource identifier.""" if mismatch_description is None: mismatch_description = StringDescription() if not isinstance(item, dict): mismatch_description.append( f"not a `dict`\n got: `{item.__class__.__name__}`") return False if "id" not in item: mismatch_description.append("missing key id") return False id_value = item["id"] if not isinstance(id_value, str): mismatch_description.append("id is not a string") return False if id_value == "": mismatch_description.append("id is blank") return False if "type" not in item: mismatch_description.append("missing key type") return False type_value = item["type"] if type_value != self.resource_name: mismatch_description.append( f'type does not match "{self.resource_name}"') return False return True