Skip to content

Commit 2d53fd1

Browse files
rafaelcalixtoRafael Araujo
andauthored
refactor: Optimizing cep function (#668)
* Refacturing functions remove_symbols and format_cep * updating documentation * resolving format issue * updating according code review * including lint --------- Co-authored-by: Rafael Araujo <[email protected]>
1 parent f00812b commit 2d53fd1

File tree

5 files changed

+55
-102
lines changed

5 files changed

+55
-102
lines changed

README.md

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -333,14 +333,18 @@ False
333333
### format_cep
334334

335335
Formata um CEP (Código de Endereçamento Postal) brasileiro em um formato padrão.
336-
Esta função recebe um CEP como entrada e, se for um CEP válido com 8 dígitos,
337-
o formata no padrão "12345-678".
336+
Esta função recebe um CEP como entrada, remove caracteres especiais e, se for um
337+
CEP válido com 8 dígitos, e retorna o formata no padrão "12345-678" ou apenas os
338+
números "12345678" se o parâmetro only_nums for True.
338339

339340
Argumentos:
340341

341342
- cep (str): O CEP (Código de Endereçamento Postal) de entrada a ser
342343
formatado.
343344

345+
- only_nums (bool): Valor default é False, caso seja passado True como valor
346+
será retornada uma string contendo apenas números
347+
344348
Retorna:
345349

346350
- str: O CEP formatado no formato "12345-678" se for válido, None se não for
@@ -352,37 +356,14 @@ Example:
352356
>>> from brutils import format_cep
353357
>>> format_cep('01310200')
354358
'01310-200'
355-
>>> format_cep("12345678")
359+
>>> format_cep(" 12.345_678 ")
360+
"12345-678"
361+
>>> format_cep("12345678", only_nums=True)
356362
"12345-678"
357363
>>> format_cep("12345")
358364
None
359-
```
360-
361-
### remove_symbols_cep
362-
363-
Remove símbolos específicos de um CEP (Código de Endereçamento Postal)
364-
fornecido. Esta função recebe um CEP como entrada e remove todas as ocorrências
365-
dos caracteres '.' e '-' dele.
366-
367-
Argumentos:
368-
369-
- cep (str): O CEP (Código de Endereçamento Postal) de entrada que contém os
370-
símbolos a serem removidos.
371-
372-
Retorna:
373-
374-
- str: Uma nova string com os símbolos especificados removidos.
375-
376-
Exemplo:
377-
378-
```python
379-
>>> from brutils import remove_symbols_cep
380-
>>> remove_symbols_cep('01310-200')
381-
'01310200'
382-
>>> remove_symbols_cep("123-45.678.9")
383-
"123456789"
384-
>>> remove_symbols_cep("abc.xyz")
385-
"abcxyz"
365+
>>> format_cep("ac345-564")
366+
"ac345-564"
386367
```
387368

388369
### generate_cep

README_EN.md

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -334,13 +334,19 @@ False
334334

335335
### format_cep
336336

337-
This function takes a CEP (Postal Code) as input and, if it is a valid
338-
8-digit CEP, formats it into the standard "12345-678" format.
337+
This function formats a brazillian postal code (CEP) in the standard format.
338+
It receives a CEP as input, removes all special characters, validates if the
339+
CEP is 8 digits long, and returns the standard format "12345-678" or only the
340+
numbers "12345678" if the parameters only_nums is setted as True.
339341

340342
Args:
341343

342344
- cep (str): The input CEP (Postal Code) to be formatted.
343345

346+
- only_nums (bool): The default value is False, in case of the True value be
347+
inputed, the function will return a string with only
348+
numbers
349+
344350
Returns:
345351

346352
- str: The formatted CEP in the "12345-678" format if it's valid,
@@ -352,35 +358,14 @@ Example:
352358
>>> from brutils import format_cep
353359
>>> format_cep('01310200')
354360
'01310-200'
355-
>>> format_cep("12345678")
361+
>>> format_cep(" 12.345_678 ")
362+
"12345-678"
363+
>>> format_cep("12345678", only_nums=True)
356364
"12345-678"
357365
>>> format_cep("12345")
358366
None
359-
```
360-
361-
### remove_symbols_cep
362-
363-
This function takes a CEP (Postal Code) as input and removes all occurrences of
364-
the '.' and '-' characters from it.
365-
366-
Args:
367-
368-
- cep (str): The input CEP (Postal Code) containing symbols to be removed.
369-
370-
Returns:
371-
372-
- str: A new string with the specified symbols removed.
373-
374-
Example:
375-
376-
```python
377-
>>> from brutils import remove_symbols_cep
378-
>>> remove_symbols_cep('01310-200')
379-
'01310200'
380-
>>> remove_symbols_cep("123-45.678.9")
381-
"123456789"
382-
>>> remove_symbols_cep("abc.xyz")
383-
"abcxyz"
367+
>>> format_cep("ac345-564")
368+
"ac345-564"
384369
```
385370

386371
### generate_cep

brutils/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
)
77
from brutils.cep import generate as generate_cep
88
from brutils.cep import is_valid as is_valid_cep
9-
from brutils.cep import remove_symbols as remove_symbols_cep
109

1110
# CNH Imports
1211
from brutils.cnh import is_valid_cnh as is_valid_cnh
@@ -95,7 +94,6 @@
9594
"get_cep_information_from_address",
9695
"generate_cep",
9796
"is_valid_cep",
98-
"remove_symbols_cep",
9997
# CNPJ
10098
"format_cnpj",
10199
"generate_cnpj",

brutils/cep.py

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,15 @@
1111
############
1212

1313

14-
def remove_symbols(dirty: str) -> str:
15-
"""
16-
Removes specific symbols from a given CEP (Postal Code).
17-
18-
This function takes a CEP (Postal Code) as input and removes all occurrences
19-
of the '.' and '-' characters from it.
20-
21-
Args:
22-
cep (str): The input CEP (Postal Code) containing symbols to be removed.
23-
24-
Returns:
25-
str: A new string with the specified symbols removed.
26-
27-
Example:
28-
>>> remove_symbols("123-45.678.9")
29-
"123456789"
30-
>>> remove_symbols("abc.xyz")
31-
"abcxyz"
32-
"""
33-
34-
return "".join(filter(lambda char: char not in ".-", dirty))
35-
36-
37-
def format_cep(cep: str) -> str | None:
14+
def format_cep(cep: str, only_nums=False) -> str | None:
3815
"""
3916
Formats a Brazilian CEP (Postal Code) into a standard format.
4017
41-
This function takes a CEP (Postal Code) as input and, if it is a valid
42-
8-digit CEP, formats it into the standard "12345-678" format.
18+
This function takes a CEP (Postal Code) as input and,
19+
- Removes special characteres;
20+
- Check if the string follows the CEP length pattern;
21+
- Returns None if the string is out of the pattern;
22+
- Return a string with the formatted CEP.
4323
4424
Args:
4525
cep (str): The input CEP (Postal Code) to be formatted.
@@ -51,11 +31,27 @@ def format_cep(cep: str) -> str | None:
5131
Example:
5232
>>> format_cep("12345678")
5333
"12345-678"
34+
>>> format_cep(" 12.345/678 ", only_nums=True)
35+
"12345678"
5436
>>> format_cep("12345")
5537
None
5638
"""
39+
### Checking data type
40+
if not isinstance(cep, str):
41+
return None
42+
43+
### Removing special characteres
44+
cep = "".join(filter(str.isalnum, cep))
45+
46+
### Checking CEP patterns
47+
if len(cep) != 8:
48+
return None
5749

58-
return f"{cep[:5]}-{cep[5:8]}" if is_valid(cep) else None
50+
### Returning CEP value
51+
if only_nums:
52+
return cep
53+
else:
54+
return f"{cep[:5]}-{cep[5:]}"
5955

6056

6157
# OPERATIONS
@@ -156,7 +152,7 @@ def get_address_from_cep(
156152
"""
157153
base_api_url = "https://viacep.com.br/ws/{}/json/"
158154

159-
clean_cep = remove_symbols(cep)
155+
clean_cep = format_cep(cep, only_nums=True)
160156
cep_is_valid = is_valid(clean_cep)
161157

162158
if not cep_is_valid:

tests/test_cep.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,16 @@
99
get_address_from_cep,
1010
get_cep_information_from_address,
1111
is_valid,
12-
remove_symbols,
1312
)
1413

1514

1615
class TestCEP(TestCase):
1716
def test_remove_symbols(self):
18-
self.assertEqual(remove_symbols("00000000"), "00000000")
19-
self.assertEqual(remove_symbols("01310-200"), "01310200")
20-
self.assertEqual(remove_symbols("01..310.-200.-"), "01310200")
21-
self.assertEqual(remove_symbols("abc01310200*!*&#"), "abc01310200*!*&#")
22-
self.assertEqual(
23-
remove_symbols("ab.c1.--.3-102.-0-.0-.*.-!*&#"), "abc1310200*!*&#"
24-
)
25-
self.assertEqual(remove_symbols("...---..."), "")
17+
self.assertEqual(format_cep("00000000"), "00000-000")
18+
self.assertEqual(format_cep("01310-200", only_nums=True), "01310200")
19+
self.assertEqual(format_cep("01..310.-200.-"), "01310-200")
20+
self.assertEqual(format_cep("abc01310200*!*&#"), None)
21+
self.assertEqual(format_cep("ab.c1.--.3-102.-0-.0-.*.-!*&#"), None)
2622

2723
def test_is_valid(self):
2824
# When CEP is not string, returns False
@@ -50,14 +46,11 @@ def test_when_cep_is_valid_returns_True_to_format(self, mock_is_valid):
5046

5147
self.assertEqual(format_cep("01310200"), "01310-200")
5248

53-
# Checks if function is_valid_cnpj is called
54-
mock_is_valid.assert_called_once_with("01310200")
55-
56-
def test_when_cep_is_not_valid_returns_none(self, mock_is_valid):
49+
def test_when_cep_is_not_valid_returns_error(self, mock_is_valid):
5750
mock_is_valid.return_value = False
5851

5952
# When cep isn't valid, returns None
60-
self.assertIsNone(format_cep("013102009"))
53+
self.assertEqual(format_cep("013102009"), None)
6154

6255

6356
@patch("brutils.cep.urlopen")

0 commit comments

Comments
 (0)