Skip to content

Commit 5441be3

Browse files
committed
Merge pull request #68 from rochacbruno/master
Suporte a XML, executar direto com python PostmonServer.py, XML testes, suporte a MongoDb com auth.
2 parents 194efac + 893b2ef commit 5441be3

File tree

5 files changed

+67
-4
lines changed

5 files changed

+67
-4
lines changed

PostmonServer.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# -*- coding: utf-8 -*-
33
import bottle
44
import json
5+
import xmltodict
56
from bottle import route, run, response
67
from CepTracker import CepTracker
78
import requests
@@ -36,6 +37,12 @@ def format_result(result):
3637
# checa se foi solicitada resposta em JSONP
3738
js_func_name = bottle.request.query.get(jsonp_query_key)
3839

40+
#checa se foi solicitado xml
41+
format = bottle.request.query.get('format')
42+
if format == 'xml':
43+
response.content_type = 'application/xml'
44+
return xmltodict.unparse({'result': result})
45+
3946
if js_func_name:
4047
# se a resposta vai ser JSONP, o content type deve ser js e seu
4148
# conteudo deve ser JSON
@@ -71,7 +78,6 @@ def verifica_cep(cep):
7178
result = db.get_one(cep, fields={'_id': False, 'v_date': False})
7279

7380
if result:
74-
7581
response.headers['Cache-Control'] = 'public, max-age=2592000'
7682
return format_result(result)
7783
else:
@@ -110,9 +116,12 @@ def track_pack(provider, track):
110116
else:
111117
response.status = '404 O Servico %s nao pode ser encontrado' % provider
112118

113-
114119
bottle.mount('/v1', app_v1)
115120

116121

117122
def _standalone(port=9876):
118-
run(host='localhost', port=port)
123+
run(host='0.0.0.0', port=port)
124+
125+
126+
if __name__ == "__main__":
127+
_standalone()

README.md

+24
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,31 @@ na raiz do projeto.
3232
Rodando a aplicação localmente na porta 9876
3333
--------------------------------
3434

35+
$ python PostmonServer.py
36+
37+
ou
38+
3539
$ ipython -i PostmonServer.py
3640
>> _standalone()
3741

3842
Caso queira rodar em outra porta, basta passá-la como parametro no chamado do _standalone
43+
44+
45+
MongoDB com autenticação
46+
------------------------
47+
48+
Se o seu MongoDB possui autenticação habilitada você deverá configurar o banco do postmon
49+
e também exportar duas variavéis de ambiente.
50+
51+
```javascript
52+
mongo
53+
> use postmon
54+
> db.addUser('admin', '123456')
55+
```
56+
57+
Agora que seu Mongo está com password exporte as variaveis de ambiente.
58+
59+
```bash
60+
export POSTMON_DB_USER=admin
61+
export POSTMON_DB_PASSWORD=123456
62+
```

database.py

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
3+
import os
34
import pymongo
45

56

@@ -15,6 +16,10 @@ class MongoDb(object):
1516

1617
def __init__(self, address='localhost'):
1718
self._client = pymongo.MongoClient(address)
19+
USERNAME = os.environ.get('POSTMON_DB_USER')
20+
PASSWORD = os.environ.get('POSTMON_DB_PASSWORD')
21+
if all((USERNAME, PASSWORD)):
22+
self._client.postmon.authenticate(USERNAME, PASSWORD)
1823
self._db = self._client.postmon
1924

2025
def get_one(self, cep, **kwargs):

requirements.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ pymongo==2.4
55
requests==0.14.2
66
webtest==1.4.3
77
packtrack==0.1.0
8-
flake8
8+
xmltodict
9+
flake8

test/postmon_test.py

+24
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,27 @@ class PostmonV1WebTest(PostmonWebTest):
168168
def get_cep(self, cep):
169169
response = self.app.get('/v1/cep/' + cep)
170170
return response.json
171+
172+
173+
class PostmonXMLTest(unittest.TestCase):
174+
""" testa requisições XML """
175+
176+
def setUp(self):
177+
self.app = webtest.TestApp(bottle.app())
178+
179+
def get_cep(self, cep):
180+
response = self.app.get(
181+
'/cep/%s?format=xml' % cep
182+
)
183+
return response
184+
185+
def test_xml_return(self):
186+
import xmltodict
187+
response = self.get_cep('06708070')
188+
parsed = xmltodict.parse(response.body)
189+
result = parsed.get('result')
190+
self.assertEqual(result['bairro'], u'Parque S\xe3o George')
191+
self.assertEqual(result['cidade'], u'Cotia')
192+
self.assertEqual(result['cep'], u'06708070')
193+
self.assertEqual(result['estado'], u'SP')
194+
self.assertEqual(result['logradouro'], u'Avenida Eid Mansur')

0 commit comments

Comments
 (0)