Skip to content

Commit 194efac

Browse files
committed
Merge pull request #67 from avelino/master
Fix pep8
2 parents 1f26e46 + d6db4d2 commit 194efac

File tree

9 files changed

+316
-287
lines changed

9 files changed

+316
-287
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ language: python
22

33
before_install: pip install -r requirements.txt
44

5-
script: nosetests
5+
script: make test
66

77
services: mongodb

CepTracker.py

Lines changed: 58 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,65 @@
1-
# encoding: utf-8
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
23
from datetime import datetime
34

45
import requests
56
import re
67

8+
79
class CepTracker():
810

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

Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
.PHONY: test
3+
test: pep8
4+
nosetests
5+
6+
.PHONY: pep8
7+
pep8:
8+
@flake8 * --ignore=F403,F401 --exclude=requirements.txt,*.pyc,*.md,COPYING,Makefile,*.wsgi

PostmonServer.py

Lines changed: 75 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
13
import bottle
24
import json
35
from bottle import route, run, response
@@ -6,104 +8,111 @@
68
from correios import Correios
79
from database import MongoDb as Database
810

11+
912
app_v1 = bottle.Bottle()
1013
jsonp_query_key = 'callback'
1114

15+
1216
def expired(record_date):
13-
from datetime import datetime, timedelta
17+
from datetime import datetime, timedelta
1418

15-
WEEKS = 26 #6 months
19+
# 6 months
20+
WEEKS = 26
1621

17-
now = datetime.now()
22+
now = datetime.now()
1823

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

2126

2227
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
28+
tracker = CepTracker()
29+
info = tracker.track(cep)
30+
if len(info) == 0:
31+
raise ValueError()
32+
return info
2833

2934

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

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)
39+
if js_func_name:
40+
# se a resposta vai ser JSONP, o content type deve ser js e seu
41+
# conteudo deve ser JSON
42+
response.content_type = 'application/javascript'
43+
result = json.dumps(result)
3944

40-
result = '%s(%s);' % (js_func_name, result)
41-
return result
45+
result = '%s(%s);' % (js_func_name, result)
46+
return result
4247

4348

4449
@route('/cep/<cep:re:\d{5}-?\d{3}>')
4550
@app_v1.route('/cep/<cep:re:\d{5}-?\d{3}>')
4651
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
52+
cep = cep.replace('-', '')
53+
db = Database()
54+
response.headers['Access-Control-Allow-Origin'] = '*'
55+
56+
result = db.get_one(cep, fields={'_id': False})
57+
if result and 'v_date' in result and not expired(result):
58+
result.pop('v_date')
59+
else:
60+
try:
61+
info = _get_info_from_source(cep)
62+
except ValueError:
63+
response.status = "404 O CEP {0} informado nao pode ser "
64+
"localizado".format(cep)
65+
return
66+
except requests.exceptions.RequestException:
67+
response.status = '503 Servico Temporariamente Indisponivel'
68+
return
69+
for item in info:
70+
db.insert_or_update(item)
71+
result = db.get_one(cep, fields={'_id': False, 'v_date': False})
72+
73+
if result:
74+
75+
response.headers['Cache-Control'] = 'public, max-age=2592000'
76+
return format_result(result)
77+
else:
78+
response.status = '404 O CEP %s informado nao pode ser '
79+
'localizado' % cep
80+
return
7481

7582

7683
@app_v1.route('/rastreio/<provider>/<track>')
7784
def track_pack(provider, track):
78-
if provider == 'ect':
79-
try:
80-
encomenda = Correios.encomenda(track)
85+
if provider == 'ect':
86+
try:
87+
encomenda = Correios.encomenda(track)
8188

82-
resposta = dict()
83-
result = []
89+
resposta = dict()
90+
result = []
8491

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
92+
for status in encomenda.status:
93+
historico = dict()
94+
historico['data'] = status.data
95+
historico['local'] = status.local
96+
historico['situacao'] = status.situacao
97+
historico['detalhes'] = status.detalhes
9298

93-
result.append(historico)
99+
result.append(historico)
94100

95-
resposta['servico'] = provider
96-
resposta['codigo'] = track
97-
resposta['historico'] = result
101+
resposta['servico'] = provider
102+
resposta['codigo'] = track
103+
resposta['historico'] = result
98104

99-
return format_result(resposta)
105+
return format_result(resposta)
106+
107+
except AttributeError:
108+
response.status = "404 O pacote {0} informado nao pode ser "
109+
"localizado".format(track)
110+
else:
111+
response.status = '404 O Servico %s nao pode ser encontrado' % provider
100112

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
105113

106114
bottle.mount('/v1', app_v1)
107115

116+
108117
def _standalone(port=9876):
109118
run(host='localhost', port=port)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Rodando testes
2525
----------------
2626
Executar o comando:
2727

28-
nosetests
28+
make test
2929

3030
na raiz do projeto.
3131

database.py

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,32 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
13
import pymongo
24

5+
36
class MongoDb(object):
47

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

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

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

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

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

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

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

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ nose==1.2.1
44
pymongo==2.4
55
requests==0.14.2
66
webtest==1.4.3
7-
packtrack==0.1.0
7+
packtrack==0.1.0
8+
flake8

0 commit comments

Comments
 (0)