Skip to content

Commit 542d604

Browse files
committed
Implementation of issue brazilian-utils#430, which requests the validation of RENAVAM and its respective tests. Additionally, the appropriate documentation as required by the contribution file.
1 parent b8e84bd commit 542d604

File tree

5 files changed

+163
-0
lines changed

5 files changed

+163
-0
lines changed

README.md

+34
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,40 @@ Exemplo:
12541254
None
12551255
```
12561256

1257+
## RENAVAM
1258+
1259+
### is_valid_renavam
1260+
1261+
Valida o número de registro de veículo brasileiro (RENAVAM).
1262+
1263+
Esta função recebe uma string RENAVAM e verifica se é válida. Um RENAVAM
1264+
válido consiste exatamente em 11 dígitos. O último dígito é um dígito verificador
1265+
calculado a partir dos primeiros 10 dígitos usando um sistema de pesos específicos.
1266+
1267+
Parâmetros:
1268+
renavam (str): A string do RENAVAM a ser validada.
1269+
1270+
Retorna:
1271+
bool: True se o RENAVAM for válido, False caso contrário.
1272+
1273+
Exemplo:
1274+
1275+
```python
1276+
>>> from brutils import is_valid_renavam
1277+
>>> is_valid_renavam('35298206229')
1278+
True
1279+
>>> is_valid_renavam('12345678900')
1280+
False
1281+
>>> is_valid_renavam('1234567890a')
1282+
False
1283+
>>> is_valid_renavam('12345678 901')
1284+
False
1285+
>>> is_valid_renavam('12345678') # Less than 11 digits
1286+
False
1287+
>>> is_valid_renavam('') # Empty string
1288+
False
1289+
```
1290+
12571291
# Novos Utilitários e Reportar Bugs
12581292

12591293
Caso queira sugerir novas funcionalidades ou reportar bugs, basta criar

README_EN.md

+34
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,40 @@ Example:
12571257
None
12581258
```
12591259

1260+
## RENAVAM
1261+
1262+
### is_valid_renavam
1263+
1264+
Validates the Brazilian vehicle registration number (RENAVAM).
1265+
1266+
This function takes a RENAVAM string and checks if it is valid.
1267+
A valid RENAVAM consists of exactly 11 digits. Theast digit a check digit
1268+
calculated from the the first 10 digits using a specific weighting system.
1269+
1270+
Args:
1271+
renavam (str): The RENAVAM string to be validated.
1272+
1273+
Returns:
1274+
bool: True if the RENAVAM is valid, False otherwise.
1275+
1276+
Example:
1277+
1278+
```python
1279+
>>> from brutils import is_valid_renavam
1280+
>>> is_valid_renavam('35298206229')
1281+
True
1282+
>>> is_valid_renavam('12345678900')
1283+
False
1284+
>>> is_valid_renavam('1234567890a')
1285+
False
1286+
>>> is_valid_renavam('12345678 901')
1287+
False
1288+
>>> is_valid_renavam('12345678') # Less than 11 digits
1289+
False
1290+
>>> is_valid_renavam('') # Empty string
1291+
False
1292+
```
1293+
12601294
# Feature Request and Bug Report
12611295

12621296
If you want to suggest new features or report bugs, simply create

brutils/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@
7070
from brutils.pis import is_valid as is_valid_pis
7171
from brutils.pis import remove_symbols as remove_symbols_pis
7272

73+
# RENAVAM Imports
74+
from brutils.renavam import is_valid_renavam
75+
7376
# Voter ID Imports
7477
from brutils.voter_id import format_voter_id
7578
from brutils.voter_id import generate as generate_voter_id
@@ -133,4 +136,6 @@
133136
"is_holiday",
134137
# Currency
135138
"format_currency",
139+
# RENAVAM
140+
"is_valid_renavam",
136141
]

brutils/renavam.py

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
def is_valid_renavam(renavam): # type: (str) -> bool
2+
"""
3+
Validates the Brazilian vehicle registration number (RENAVAM).
4+
5+
This function takes a RENAVAM string and checks if it is valid.
6+
A valid RENAVAM consists of exactly 11 digits. Theast digit a check digit
7+
calculated from the the first 10 digits using a specific weighting system.
8+
9+
Args:
10+
renavam (str): The RENAVAM string to be validated.
11+
12+
Returns:
13+
bool: True if the RENAVAM is valid, False otherwise.
14+
15+
Example:
16+
>>> is_valid_renavam('35298206229')
17+
True
18+
>>> is_valid_renavam('12345678900')
19+
False
20+
>>> is_valid_renavam('1234567890a')
21+
False
22+
>>> is_valid_renavam('12345678 901')
23+
False
24+
>>> is_valid_renavam('12345678') # Less than 11 digits
25+
False
26+
>>> is_valid_renavam('') # Empty string
27+
False
28+
"""
29+
30+
if len(renavam) != 11 or not renavam.isdigit():
31+
return False
32+
33+
## Calculating the check digit
34+
digits = [int(digit) for digit in renavam[:10]] # 10 digits
35+
weights = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
36+
checksum = sum(
37+
digit * weight for digit, weight in zip(digits, weights)
38+
) # Sum of the products of the digits and weights
39+
40+
remainder = checksum % 11
41+
check_digit = 0 if remainder == 0 else 11 - remainder
42+
43+
# If the calculated check digit is 0, return False
44+
if check_digit == 0:
45+
return False
46+
47+
# Checking if the calculated check digit is equal to the last digit of the RENAVAM
48+
return int(renavam[-1]) == check_digit

tests/test_renavam.py

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from unittest import TestCase
2+
3+
from brutils.renavam import is_valid_renavam
4+
5+
6+
class TestRENAVAM(TestCase):
7+
def test_valid_renavam(self):
8+
# First
9+
self.assertTrue(is_valid_renavam("79831854647"))
10+
self.assertFalse(is_valid_renavam("1234567890")) # Less than 11 digits
11+
self.assertFalse(
12+
is_valid_renavam("123456789012")
13+
) # More than 11 digits
14+
# Second
15+
self.assertFalse(is_valid_renavam("1234567890a")) # With letter
16+
self.assertFalse(is_valid_renavam("12345678 901")) # With space
17+
self.assertFalse(
18+
is_valid_renavam("12345678901!")
19+
) # With special character
20+
self.assertFalse(is_valid_renavam("")) # Empty string
21+
22+
# Third
23+
def test_renavam_check_digit(self):
24+
self.assertTrue(is_valid_renavam("01044683357"))
25+
self.assertFalse(is_valid_renavam("12345678901")) # Invalid check digit
26+
27+
# Fourth - Issue
28+
def test_is_valid_renavam(self):
29+
# Tests for valid RENAVAM
30+
self.assertTrue(
31+
is_valid_renavam("35298206229")
32+
) # Change this one because in the issue example it is invalid
33+
self.assertFalse(is_valid_renavam("12345678900"))
34+
35+
# Tests for invalid RENAVAM
36+
self.assertFalse(is_valid_renavam("1234567890a"))
37+
self.assertFalse(is_valid_renavam("12345678 901"))
38+
self.assertFalse(is_valid_renavam("12345678"))
39+
self.assertFalse(is_valid_renavam(""))
40+
self.assertFalse(is_valid_renavam("123456789012"))
41+
self.assertFalse(is_valid_renavam("abcdefghijk"))
42+
self.assertFalse(is_valid_renavam("12345678901!"))

0 commit comments

Comments
 (0)