Skip to content

Release v<2.3.0> #487

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Utilitário `get_municipality_by_code` [412](https://github.com/brazilian-utils/brutils-python/pull/412)
- Utilitário `get_code_by_municipality_name` [#399](https://github.com/brazilian-utils/brutils-python/issues/399)
- Utilitário `format_currency` [#426](https://github.com/brazilian-utils/brutils-python/issues/426)
- Utilitário `is_valid_renavam` [#430](https://github.com/brazilian-utils/brutils-python/issues/430)

## [2.2.0] - 2024-09-12

Expand Down
34 changes: 34 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1254,6 +1254,40 @@ Exemplo:
None
```

## RENAVAM

### is_valid_renavam

Valida o número de registro de veículo brasileiro (RENAVAM).

Esta função recebe uma string RENAVAM e verifica se é válida. Um RENAVAM
válido consiste exatamente em 11 dígitos. O último dígito é um dígito verificador
calculado a partir dos primeiros 10 dígitos usando um sistema de pesos específicos.

Parâmetros:
renavam (str): A string do RENAVAM a ser validada.

Retorna:
bool: True se o RENAVAM for válido, False caso contrário.

Exemplo:

```python
>>> from brutils import is_valid_renavam
>>> is_valid_renavam('35298206229')
True
>>> is_valid_renavam('12345678900')
False
>>> is_valid_renavam('1234567890a')
False
>>> is_valid_renavam('12345678 901')
False
>>> is_valid_renavam('12345678') # Less than 11 digits
False
>>> is_valid_renavam('') # Empty string
False
```

# Novos Utilitários e Reportar Bugs

Caso queira sugerir novas funcionalidades ou reportar bugs, basta criar
Expand Down
34 changes: 34 additions & 0 deletions README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -1257,6 +1257,40 @@ Example:
None
```

## RENAVAM

### is_valid_renavam

Validates the Brazilian vehicle registration number (RENAVAM).

This function takes a RENAVAM string and checks if it is valid.
A valid RENAVAM consists of exactly 11 digits. Theast digit a check digit
calculated from the the first 10 digits using a specific weighting system.

Args:
renavam (str): The RENAVAM string to be validated.

Returns:
bool: True if the RENAVAM is valid, False otherwise.

Example:

```python
>>> from brutils import is_valid_renavam
>>> is_valid_renavam('35298206229')
True
>>> is_valid_renavam('12345678900')
False
>>> is_valid_renavam('1234567890a')
False
>>> is_valid_renavam('12345678 901')
False
>>> is_valid_renavam('12345678') # Less than 11 digits
False
>>> is_valid_renavam('') # Empty string
False
```

# Feature Request and Bug Report

If you want to suggest new features or report bugs, simply create
Expand Down
5 changes: 5 additions & 0 deletions brutils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@
from brutils.pis import is_valid as is_valid_pis
from brutils.pis import remove_symbols as remove_symbols_pis

# RENAVAM Imports
from brutils.renavam import is_valid_renavam

# Voter ID Imports
from brutils.voter_id import format_voter_id
from brutils.voter_id import generate as generate_voter_id
Expand Down Expand Up @@ -133,4 +136,6 @@
"is_holiday",
# Currency
"format_currency",
# RENAVAM
"is_valid_renavam",
]
48 changes: 48 additions & 0 deletions brutils/renavam.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
def is_valid_renavam(renavam): # type: (str) -> bool
"""
Validates the Brazilian vehicle registration number (RENAVAM).

This function takes a RENAVAM string and checks if it is valid.
A valid RENAVAM consists of exactly 11 digits. Theast digit a check digit
calculated from the the first 10 digits using a specific weighting system.

Args:
renavam (str): The RENAVAM string to be validated.

Returns:
bool: True if the RENAVAM is valid, False otherwise.

Example:
>>> is_valid_renavam('35298206229')
True
>>> is_valid_renavam('12345678900')
False
>>> is_valid_renavam('1234567890a')
False
>>> is_valid_renavam('12345678 901')
False
>>> is_valid_renavam('12345678') # Less than 11 digits
False
>>> is_valid_renavam('') # Empty string
False
"""

if len(renavam) != 11 or not renavam.isdigit():
return False

## Calculating the check digit
digits = [int(digit) for digit in renavam[:10]] # 10 digits
weights = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
checksum = sum(
digit * weight for digit, weight in zip(digits, weights)
) # Sum of the products of the digits and weights

remainder = checksum % 11
check_digit = 0 if remainder == 0 else 11 - remainder

# If the calculated check digit is 0, return False
if check_digit == 0:
return False

# Checking if the calculated check digit is equal to the last digit of the RENAVAM
return int(renavam[-1]) == check_digit
42 changes: 42 additions & 0 deletions tests/test_renavam.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from unittest import TestCase

from brutils.renavam import is_valid_renavam


class TestRENAVAM(TestCase):
def test_valid_renavam(self):
# First
self.assertTrue(is_valid_renavam("79831854647"))
self.assertFalse(is_valid_renavam("1234567890")) # Less than 11 digits
self.assertFalse(
is_valid_renavam("123456789012")
) # More than 11 digits
# Second
self.assertFalse(is_valid_renavam("1234567890a")) # With letter
self.assertFalse(is_valid_renavam("12345678 901")) # With space
self.assertFalse(
is_valid_renavam("12345678901!")
) # With special character
self.assertFalse(is_valid_renavam("")) # Empty string

# Third
def test_renavam_check_digit(self):
self.assertTrue(is_valid_renavam("01044683357"))
self.assertFalse(is_valid_renavam("12345678901")) # Invalid check digit

# Fourth - Issue
def test_is_valid_renavam(self):
# Tests for valid RENAVAM
self.assertTrue(
is_valid_renavam("35298206229")
) # Change this one because in the issue example it is invalid
self.assertFalse(is_valid_renavam("12345678900"))

# Tests for invalid RENAVAM
self.assertFalse(is_valid_renavam("1234567890a"))
self.assertFalse(is_valid_renavam("12345678 901"))
self.assertFalse(is_valid_renavam("12345678"))
self.assertFalse(is_valid_renavam(""))
self.assertFalse(is_valid_renavam("123456789012"))
self.assertFalse(is_valid_renavam("abcdefghijk"))
self.assertFalse(is_valid_renavam("12345678901!"))