Created
January 16, 2024 04:42
-
-
Save danielomiya/2181d39b876723b58c6f9d67435d20a0 to your computer and use it in GitHub Desktop.
Brazilian Portuguese custom error messages for Pydantic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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