Skip to content

Commit 33b8b0a

Browse files
author
Alê Borba
committed
Resolvendo o bug #16
2 parents 5c0acee + f050a70 commit 33b8b0a

File tree

5 files changed

+81
-9
lines changed

5 files changed

+81
-9
lines changed

PostmonServer.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from bottle import route, run, error, response
1+
from bottle import route, run, response
22
from CepTracker import CepTracker
33
from requests import ConnectionError
44

5-
import pymongo, json, re
5+
from database import MongoDb as Database
66

77
def expired(record_date):
88
from datetime import datetime, timedelta
@@ -23,27 +23,26 @@ def _get_info_from_correios(cep):
2323

2424
return info
2525

26+
2627
@route('/cep/<cep:re:\d{5}-?\d{3}>')
2728
def verifica_cep(cep):
2829
cep = cep.replace('-','')
30+
db = Database()
2931

3032
response.headers['Access-Control-Allow-Origin'] = '*'
31-
33+
3234
try:
33-
con = pymongo.MongoClient('localhost')
34-
db = con.postmon
35-
ceps = db.ceps
36-
result = ceps.find_one({'cep':cep}, fields={'_id':False})
35+
result = db.get_one(cep, fields={ '_id': False })
3736

3837
if not result or not result.has_key('v_date') or expired(result):
3938
try:
4039
for item in _get_info_from_correios(cep):
41-
ceps.update({'cep': item['cep']}, {'$set': item}, upsert=True)
40+
db.insert_or_update(item)
4241

4342
except ConnectionError:
4443
response.status = '503 Servico Temporariamente Indisponivel'
4544

46-
result = ceps.find_one({'cep':cep}, fields={'_id':False,'v_date':False})
45+
result = db.get_one(cep, fields={ '_id': False, 'v_date': False })
4746

4847
response.headers['Cache-Control'] = 'public, max-age=2592000'
4948

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
This file is placed here by pip to indicate the source was put
2+
here by pip.
3+
4+
Once this package is successfully installed this source code will be
5+
deleted (unless you remove this file).

database.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import pymongo
2+
3+
class MongoDb(object):
4+
5+
_fields = [
6+
'logradouro',
7+
'bairro',
8+
'cidade',
9+
'estado'
10+
]
11+
12+
def __init__(self, address='localhost'):
13+
self._client = pymongo.MongoClient(address)
14+
self._db = self._client.postmon
15+
16+
def get_one(self, cep, **kwargs):
17+
return self._db.ceps.find_one({ 'cep': cep }, **kwargs)
18+
19+
def insert_or_update(self, obj, **kwargs):
20+
21+
update = { '$set': obj }
22+
empty_fields = set(self._fields) - set(obj)
23+
update['$unset'] = dict((x, 1) for x in empty_fields)
24+
25+
self._db.ceps.update({ 'cep': obj['cep'] }, update, upsert=True)
26+
27+
def remove(self, cep):
28+
self._db.ceps.remove({ 'cep': cep })

test/database_test.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# encoding: utf-8
2+
import unittest
3+
4+
from database import MongoDb
5+
6+
class MongoDbTest(unittest.TestCase):
7+
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')

test/postmon_test.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def assertCep(self, cep):
107107
except webtest.AppError as ex:
108108
if not expected and '404' in ex.message and cep in ex.message:
109109
return
110+
raise ex
110111

111112
for k, v in expected[0].items():
112113
self.assertEqual(v, result[k])

0 commit comments

Comments
 (0)