Skip to content

Commit ef08919

Browse files
committed
Fix pep8: W191 indentation contains tabs, refs #42
1 parent 73ec4e0 commit ef08919

File tree

5 files changed

+287
-288
lines changed

5 files changed

+287
-288
lines changed

CepTracker.py

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -6,58 +6,58 @@
66

77
class CepTracker():
88

9-
def __init__(self):
10-
self.url = 'http://m.correios.com.br/movel/buscaCepConfirma.do'
11-
12-
def _request(self, cep):
13-
response = requests.post(self.url, data={
14-
'cepEntrada': cep,
15-
'tipoCep': '',
16-
'cepTemp': '',
17-
'metodo': 'buscarCep'
18-
})
19-
response.raise_for_status()
20-
return response.text
21-
22-
def _get_infos_(self, cep):
23-
from lxml.html import fromstring
24-
response = self._request(cep)
25-
html = fromstring(response)
26-
registro_csspattern = '.caixacampobranco, .caixacampoazul'
27-
registros = html.cssselect(registro_csspattern)
28-
29-
resultado = []
30-
for item in registros:
31-
item_csspattern = '.resposta, .respostadestaque'
32-
resultado.append([a.text for a in item.cssselect(item_csspattern)])
33-
34-
return resultado
35-
36-
def track(self, cep):
37-
itens = self._get_infos_(cep)
38-
result = []
39-
40-
for item in itens:
41-
42-
data = dict()
43-
data["v_date"] = datetime.now()
44-
45-
for label, value in zip(item[0::2], item[1::2]):
46-
47-
label = label.lower().strip(' :')
48-
value = re.sub('\s+', ' ', value.strip())
49-
50-
if 'localidade' in label:
51-
cidade, estado = value.split('/', 1)
52-
data['cidade'] = cidade.strip()
53-
data['estado'] = estado.split('-')[0].strip()
54-
elif 'logradouro' in label and ' - ' in value:
55-
logradouro, complemento = value.split(' - ', 1)
56-
data['logradouro'] = logradouro.strip()
57-
data['complemento'] = complemento.strip(' -')
58-
else:
59-
data[label] = value
60-
61-
result.append(data)
62-
63-
return result
9+
def __init__(self):
10+
self.url = 'http://m.correios.com.br/movel/buscaCepConfirma.do'
11+
12+
def _request(self, cep):
13+
response = requests.post(self.url, data={
14+
'cepEntrada': cep,
15+
'tipoCep': '',
16+
'cepTemp': '',
17+
'metodo': 'buscarCep'
18+
})
19+
response.raise_for_status()
20+
return response.text
21+
22+
def _get_infos_(self, cep):
23+
from lxml.html import fromstring
24+
response = self._request(cep)
25+
html = fromstring(response)
26+
registro_csspattern = '.caixacampobranco, .caixacampoazul'
27+
registros = html.cssselect(registro_csspattern)
28+
29+
resultado = []
30+
for item in registros:
31+
item_csspattern = '.resposta, .respostadestaque'
32+
resultado.append([a.text for a in item.cssselect(item_csspattern)])
33+
34+
return resultado
35+
36+
def track(self, cep):
37+
itens = self._get_infos_(cep)
38+
result = []
39+
40+
for item in itens:
41+
42+
data = dict()
43+
data["v_date"] = datetime.now()
44+
45+
for label, value in zip(item[0::2], item[1::2]):
46+
47+
label = label.lower().strip(' :')
48+
value = re.sub('\s+', ' ', value.strip())
49+
50+
if 'localidade' in label:
51+
cidade, estado = value.split('/', 1)
52+
data['cidade'] = cidade.strip()
53+
data['estado'] = estado.split('-')[0].strip()
54+
elif 'logradouro' in label and ' - ' in value:
55+
logradouro, complemento = value.split(' - ', 1)
56+
data['logradouro'] = logradouro.strip()
57+
data['complemento'] = complemento.strip(' -')
58+
else:
59+
data[label] = value
60+
61+
result.append(data)
62+
63+
return result

PostmonServer.py

Lines changed: 65 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,98 +10,97 @@
1010
jsonp_query_key = 'callback'
1111

1212
def expired(record_date):
13-
from datetime import datetime, timedelta
13+
from datetime import datetime, timedelta
1414

15-
WEEKS = 26 #6 months
15+
WEEKS = 26 #6 months
1616

17-
now = datetime.now()
17+
now = datetime.now()
1818

19-
return ( now - record_date['v_date'] >= timedelta(weeks=WEEKS))
19+
return ( now - record_date['v_date'] >= timedelta(weeks=WEEKS))
2020

2121

2222
def _get_info_from_source(cep):
23-
tracker = CepTracker()
24-
info = tracker.track(cep)
25-
if len(info) == 0:
26-
raise ValueError()
27-
return info
23+
tracker = CepTracker()
24+
info = tracker.track(cep)
25+
if len(info) == 0:
26+
raise ValueError()
27+
return info
2828

2929

3030
def format_result(result):
31-
# checa se foi solicitada resposta em JSONP
32-
js_func_name = bottle.request.query.get(jsonp_query_key)
31+
# checa se foi solicitada resposta em JSONP
32+
js_func_name = bottle.request.query.get(jsonp_query_key)
3333

34-
if js_func_name:
35-
# se a resposta vai ser JSONP, o content type deve ser js e seu
36-
# conteudo deve ser JSON
37-
response.content_type = 'application/javascript'
38-
result = json.dumps(result)
34+
if js_func_name:
35+
# se a resposta vai ser JSONP, o content type deve ser js e seu
36+
# conteudo deve ser JSON
37+
response.content_type = 'application/javascript'
38+
result = json.dumps(result)
3939

40-
result = '%s(%s);' % (js_func_name, result)
41-
return result
40+
result = '%s(%s);' % (js_func_name, result)
41+
return result
4242

4343

4444
@route('/cep/<cep:re:\d{5}-?\d{3}>')
4545
@app_v1.route('/cep/<cep:re:\d{5}-?\d{3}>')
4646
def verifica_cep(cep):
47-
cep = cep.replace('-','')
48-
db = Database()
49-
response.headers['Access-Control-Allow-Origin'] = '*'
50-
51-
result = db.get_one(cep, fields={ '_id': False })
52-
if result and result.has_key('v_date') and not expired(result):
53-
result.pop('v_date')
54-
else:
55-
try:
56-
info = _get_info_from_source(cep)
57-
except ValueError:
58-
response.status = '404 O CEP %s informado nao pode ser localizado' % cep
59-
return
60-
except requests.exceptions.RequestException:
61-
response.status = '503 Servico Temporariamente Indisponivel'
62-
return
63-
for item in info:
64-
db.insert_or_update(item)
65-
result = db.get_one(cep, fields={ '_id': False, 'v_date': False })
66-
67-
if result:
68-
69-
response.headers['Cache-Control'] = 'public, max-age=2592000'
70-
return format_result(result)
71-
else:
72-
response.status = '404 O CEP %s informado nao pode ser localizado' % cep
73-
return
47+
cep = cep.replace('-','')
48+
db = Database()
49+
response.headers['Access-Control-Allow-Origin'] = '*'
50+
51+
result = db.get_one(cep, fields={ '_id': False })
52+
if result and result.has_key('v_date') and not expired(result):
53+
result.pop('v_date')
54+
else:
55+
try:
56+
info = _get_info_from_source(cep)
57+
except ValueError:
58+
response.status = '404 O CEP %s informado nao pode ser localizado' % cep
59+
return
60+
except requests.exceptions.RequestException:
61+
response.status = '503 Servico Temporariamente Indisponivel'
62+
return
63+
for item in info:
64+
db.insert_or_update(item)
65+
result = db.get_one(cep, fields={ '_id': False, 'v_date': False })
66+
67+
if result:
68+
69+
response.headers['Cache-Control'] = 'public, max-age=2592000'
70+
return format_result(result)
71+
else:
72+
response.status = '404 O CEP %s informado nao pode ser localizado' % cep
73+
return
7474

7575

7676
@app_v1.route('/rastreio/<provider>/<track>')
7777
def track_pack(provider, track):
78-
if provider == 'ect':
79-
try:
80-
encomenda = Correios.encomenda(track)
78+
if provider == 'ect':
79+
try:
80+
encomenda = Correios.encomenda(track)
8181

82-
resposta = dict()
83-
result = []
82+
resposta = dict()
83+
result = []
8484

85-
for status in encomenda.status:
86-
historico = dict()
87-
88-
historico['data'] = status.data
89-
historico['local'] = status.local
90-
historico['situacao'] = status.situacao
91-
historico['detalhes'] = status.detalhes
85+
for status in encomenda.status:
86+
historico = dict()
87+
historico['data'] = status.data
88+
historico['local'] = status.local
89+
historico['situacao'] = status.situacao
90+
historico['detalhes'] = status.detalhes
9291

93-
result.append(historico)
92+
result.append(historico)
9493

95-
resposta['servico'] = provider
96-
resposta['codigo'] = track
97-
resposta['historico'] = result
94+
resposta['servico'] = provider
95+
resposta['codigo'] = track
96+
resposta['historico'] = result
9897

99-
return format_result(resposta)
98+
return format_result(resposta)
10099

101-
except AttributeError:
102-
response.status = '404 O pacote %s informado nao pode ser localizado' %track
103-
else:
104-
response.status = '404 O Servico %s nao pode ser encontrado' %provider
100+
except AttributeError:
101+
response.status = '404 O pacote %s informado nao pode ser localizado' %track
102+
else:
103+
response.status = '404 O Servico %s nao pode ser encontrado' %provider
105104

106105
bottle.mount('/v1', app_v1)
107106

database.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,28 @@
22

33
class MongoDb(object):
44

5-
_fields = [
6-
'logradouro',
7-
'bairro',
8-
'cidade',
9-
'estado',
10-
'complemento'
11-
]
5+
_fields = [
6+
'logradouro',
7+
'bairro',
8+
'cidade',
9+
'estado',
10+
'complemento'
11+
]
1212

13-
def __init__(self, address='localhost'):
14-
self._client = pymongo.MongoClient(address)
15-
self._db = self._client.postmon
13+
def __init__(self, address='localhost'):
14+
self._client = pymongo.MongoClient(address)
15+
self._db = self._client.postmon
1616

17-
def get_one(self, cep, **kwargs):
18-
return self._db.ceps.find_one({ 'cep': cep }, **kwargs)
17+
def get_one(self, cep, **kwargs):
18+
return self._db.ceps.find_one({ 'cep': cep }, **kwargs)
1919

20-
def insert_or_update(self, obj, **kwargs):
20+
def insert_or_update(self, obj, **kwargs):
2121

22-
update = { '$set': obj }
23-
empty_fields = set(self._fields) - set(obj)
24-
update['$unset'] = dict((x, 1) for x in empty_fields)
22+
update = { '$set': obj }
23+
empty_fields = set(self._fields) - set(obj)
24+
update['$unset'] = dict((x, 1) for x in empty_fields)
2525

26-
self._db.ceps.update({ 'cep': obj['cep'] }, update, upsert=True)
26+
self._db.ceps.update({ 'cep': obj['cep'] }, update, upsert=True)
2727

28-
def remove(self, cep):
29-
self._db.ceps.remove({ 'cep': cep })
28+
def remove(self, cep):
29+
self._db.ceps.remove({ 'cep': cep })

test/database_test.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,35 @@
55

66
class MongoDbTest(unittest.TestCase):
77

8-
def setUp(self):
9-
self.db = MongoDb()
10-
11-
self.db.insert_or_update({
12-
'cep': 'UNIQUE_KEY',
13-
'logradouro': 'A',
14-
'bairro': 'A',
15-
'cidade': 'A',
16-
'estado': 'A'
17-
})
18-
19-
def test_remove_empty_fields(self):
20-
21-
'''
22-
Quando um registro é atualizado no banco de dados,
23-
as chaves inexistentes devem ser removidas.
24-
'''
25-
26-
self.db.insert_or_update({
27-
'cep': 'UNIQUE_KEY',
28-
'estado': 'B'
29-
})
30-
31-
result = self.db.get_one('UNIQUE_KEY')
32-
33-
self.assertEqual(result['estado'], 'B')
34-
self.assertNotIn('logradouro', result)
35-
self.assertNotIn('bairro', result)
36-
self.assertNotIn('cidade', result)
37-
38-
def tearDown(self):
39-
self.db.remove('UNIQUE_KEY')
8+
def setUp(self):
9+
self.db = MongoDb()
10+
11+
self.db.insert_or_update({
12+
'cep': 'UNIQUE_KEY',
13+
'logradouro': 'A',
14+
'bairro': 'A',
15+
'cidade': 'A',
16+
'estado': 'A'
17+
})
18+
19+
def test_remove_empty_fields(self):
20+
21+
'''
22+
Quando um registro é atualizado no banco de dados,
23+
as chaves inexistentes devem ser removidas.
24+
'''
25+
26+
self.db.insert_or_update({
27+
'cep': 'UNIQUE_KEY',
28+
'estado': 'B'
29+
})
30+
31+
result = self.db.get_one('UNIQUE_KEY')
32+
33+
self.assertEqual(result['estado'], 'B')
34+
self.assertNotIn('logradouro', result)
35+
self.assertNotIn('bairro', result)
36+
self.assertNotIn('cidade', result)
37+
38+
def tearDown(self):
39+
self.db.remove('UNIQUE_KEY')

0 commit comments

Comments
 (0)