Skip to content

Instantly share code, notes, and snippets.

@danielomiya
Created January 16, 2024 04:42
Show Gist options
  • Select an option

  • Save danielomiya/2181d39b876723b58c6f9d67435d20a0 to your computer and use it in GitHub Desktop.

Select an option

Save danielomiya/2181d39b876723b58c6f9d67435d20a0 to your computer and use it in GitHub Desktop.
Brazilian Portuguese custom error messages for Pydantic
from pydantic import ValidationError
from pydantic_core import ErrorDetails
CUSTOM_MESSAGES = {
"arguments_type": "Os argumentos devem ser uma tupla, lista ou um dicionário",
"assertion_error": "Falha na asserção, {error}",
"bool_parsing": "A entrada deve ser um booleano válido, não foi possível interpretar a entrada",
"bool_type": "A entrada deve ser um booleano válido",
"bytes_too_long": "Os dados devem ter no máximo {max_length} byte{expected_plural}",
"bytes_too_short": "Os dados devem ter pelo menos {min_length} byte{expected_plural}",
"bytes_type": "A entrada deve ser bytes válidos",
"callable_type": "A entrada deve ser chamável",
"custom_error": "",
"dataclass_exact_type": "A entrada deve ser uma instância de {class_name}",
"dataclass_type": "A entrada deve ser um dicionário ou uma instância de {class_name}",
"date_from_datetime_inexact": "Datetimes fornecidos para datas devem ter tempo zero - por exemplo, ser datas exatas",
"date_from_datetime_parsing": "A entrada deve ser uma data ou datetime válida, {error}",
"date_future": "A data deve estar no futuro",
"date_parsing": "A entrada deve ser uma data válida no formato AAAA-MM-DD, {error}",
"date_past": "A data deve estar no passado",
"date_type": "A entrada deve ser uma data válida",
"datetime_from_date_parsing": "A entrada deve ser um datetime ou data válido, {error}",
"datetime_future": "A entrada deve estar no futuro",
"datetime_object_invalid": "Objeto datetime inválido, recebido {error}",
"datetime_parsing": "A entrada deve ser um datetime válido, {error}",
"datetime_past": "A entrada deve estar no passado",
"datetime_type": "A entrada deve ser um datetime válido",
"decimal_max_digits": "A entrada decimal não deve ter mais do que {max_digits} dígito{expected_plural} no total",
"decimal_max_places": "A entrada decimal não deve ter mais do que {decimal_places} casa{expected_plural} decimal{expected_plural}",
"decimal_parsing": "A entrada deve ser um decimal válido",
"decimal_type": "A entrada decimal deve ser um inteiro, float, string ou objeto Decimal",
"decimal_whole_digits": "A entrada decimal não deve ter mais do que {whole_digits} dígito{expected_plural} antes do ponto decimal",
"dict_type": "A entrada deve ser um dicionário válido",
"enum": "A entrada deve ser {expected}",
"extra_forbidden": "Entradas extras não são permitidas",
"finite_number": "A entrada deve ser um número finito",
"float_parsing": "A entrada deve ser um número válido, não foi possível interpretar a string como um número",
"float_type": "A entrada deve ser um número válido",
"frozen_field": "Campo está congelado",
"frozen_instance": "Instância está congelada",
"frozen_set_type": "A entrada deve ser um frozenset válido",
"get_attribute_error": "Erro ao extrair atributo: {error}",
"greater_than": "A entrada deve ser maior que {gt}",
"greater_than_equal": "A entrada deve ser maior ou igual a {ge}",
"int_from_float": "A entrada deve ser um inteiro válido, foi recebido um número com parte fracionária",
"int_parsing": "A entrada deve ser um inteiro válido, não foi possível interpretar a string como um inteiro",
"int_parsing_size": "Não foi possível interpretar a string de entrada como um inteiro, tamanho máximo excedido",
"int_type": "A entrada deve ser um inteiro válido",
"invalid_key": "As chaves devem ser strings",
"is_instance_of": "A entrada deve ser uma instância de {class}",
"is_subclass_of": "A entrada deve ser uma subclasse de {class}",
"iterable_type": "A entrada deve ser iterável",
"iteration_error": "Erro ao iterar sobre o objeto, erro: {error}",
"json_invalid": "JSON inválido: {error}",
"json_type": "A entrada JSON deve ser string, bytes ou bytearray",
"less_than": "A entrada deve ser menor que {lt}",
"less_than_equal": "A entrada deve ser menor ou igual a {le}",
"list_type": "A entrada deve ser uma lista válida",
"literal_error": "A entrada deve ser {expected}",
"mapping_type": "A entrada deve ser um mapeamento válido, erro: {error}",
"missing": "Campo obrigatório",
"missing_argument": "Argumento obrigatório ausente",
"missing_keyword_only_argument": "Argumento obrigatório somente de palavra-chave ausente",
"missing_positional_only_argument": "Argumento posicional obrigatório ausente",
"model_attributes_type": "A entrada deve ser um dicionário válido ou um objeto para extrair campos",
"model_type": "A entrada deve ser um dicionário válido ou uma instância de {class_name}",
"multiple_argument_values": "Valores múltiplos recebidos para o argumento",
"multiple_of": "A entrada deve ser um múltiplo de {multiple_of}",
"no_such_attribute": "Objeto não possui o atributo '{attribute}'",
"none_required": "A entrada deve ser None",
"recursion_loop": "Erro de recursão - referência cíclica detectada",
"set_type": "A entrada deve ser um conjunto válido",
"string_pattern_mismatch": "A string deve corresponder ao padrão '{pattern}'",
"string_sub_type": "A entrada deve ser uma string, não uma instância de uma subclasse de str",
"string_too_long": "A string deve ter no máximo {max_length} caractere{expected_plural}",
"string_too_short": "A string deve ter pelo menos {min_length} caractere{expected_plural}",
"string_type": "A entrada deve ser uma string válida",
"string_unicode": "A entrada deve ser uma string válida, não foi possível interpretar os dados brutos como uma string unicode",
"time_delta_parsing": "A entrada deve ser um timedelta válido, {error}",
"time_delta_type": "A entrada deve ser um timedelta válido",
"time_parsing": "A entrada deve estar em um formato de horário válido, {error}",
"time_type": "A entrada deve ser um horário válido",
"timezone_aware": "A entrada deve ter informações de fuso horário",
"timezone_naive": "A entrada não deve ter informações de fuso horário",
"timezone_offset": "Deslocamento de fuso horário de {tz_expected} necessário, recebido {tz_actual}",
"too_long": "{field_type} deve ter no máximo {max_length} item{expected_plural} após a validação, e não {actual_length}",
"too_short": "{field_type} deve ter pelo menos {min_length} item{expected_plural} após a validação, e não {actual_length}",
"tuple_type": "A entrada deve ser uma tupla válida",
"unexpected_keyword_argument": "Argumento de palavra-chave inesperado",
"unexpected_positional_argument": "Argumento posicional inesperado",
"union_tag_invalid": "Tag de entrada '{tag}' encontrada usando {discriminator} não corresponde a nenhuma das tags esperadas: {expected_tags}",
"union_tag_not_found": "Não foi possível extrair a tag usando o discriminador {discriminator}",
"url_parsing": "A entrada deve ser uma URL válida, {error}",
"url_scheme": "O esquema da URL deve ser {expected_schemes}",
"url_syntax_violation": "A entrada violou as regras estritas de sintaxe de URL, {error}",
"url_too_long": "A URL deve ter no máximo {max_length} caractere{expected_plural}",
"url_type": "A entrada de URL deve ser uma string ou URL",
"uuid_parsing": "A entrada deve ser um UUID válido, {error}",
"uuid_type": "A entrada UUID deve ser uma string, bytes ou objeto UUID",
"uuid_version": "Versão do UUID {expected_version} esperada",
"value_error": "Erro de valor, {error}"
}
def convert_errors(
e: ValidationError, custom_messages: Dict[str, str] = CUSTOM_MESSAGES,
) -> List[ErrorDetails]:
new_errors: List[ErrorDetails] = []
for error in e.errors():
custom_message = custom_messages.get(error["type"])
if custom_message:
ctx = error.get("ctx")
error["msg"] = (
custom_message.format(**ctx).replace("decimals", "decimais").replace("items", "itens")
if ctx else custom_message
)
new_errors.append(error)
return new_errors
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment