diff --git a/pycorreios/__init__.py b/pycorreios/__init__.py index b5a4bf1..7374f44 100644 --- a/pycorreios/__init__.py +++ b/pycorreios/__init__.py @@ -1,5 +1,5 @@ -import correios -from correios import * +from . import correios +from .correios import * # __all__ = (correios.__all__ + cod.__all__) diff --git a/pycorreios/correios.py b/pycorreios/correios.py index a5ee08d..d247f99 100644 --- a/pycorreios/correios.py +++ b/pycorreios/correios.py @@ -6,21 +6,29 @@ Api para usar dados dos Correios """ -__version__ = '0.1.0' +__version__ = '0.2.0' __author__ = { 'Thiago Avelino': 'thiagoavelinoster@gmail.com', 'Dilan Nery': 'dnerylopes@gmail.com', } -import urllib -import urllib2 +import sys + +python_version = sys.version_info[0] +from six.moves import urllib import re + from xml.dom import minidom try: - from BeautifulSoup import BeautifulSoup + from bs4 import BeautifulSoup + + except ImportError: - raise Exception('Você não tem o modulo BeautifulSoup', ImportError) + try: + from BeautifulSoup import BeautifulSoup + except ImportError: + raise Exception('Você não tem o modulo BeautifulSoup', ImportError) class Correios(object): @@ -76,8 +84,8 @@ def frete(self, cod, GOCEP, HERECEP, peso, formato, ('StrRetorno', toback), ] - url = base_url + "?" + urllib.urlencode(fields) - dom = minidom.parse(urllib2.urlopen(url)) + url = base_url + "?" + urllib.parse.urlencode(fields) + dom = minidom.parse(urllib.request.urlopen(url)) tags_name = ('MsgErro', 'Erro', @@ -87,14 +95,20 @@ def frete(self, cod, GOCEP, HERECEP, peso, formato, 'ValorMaoPropria', 'ValorValorDeclarado', 'EntregaDomiciliar', - 'EntregaSabado',) + 'EntregaSabado',) + + # consulta de mais de um servico simultaneamente + qtd_servicos = len(str(cod).split(',')) + + if (qtd_servicos > 1): + return self._dom_to_object(dom.firstChild) return self._getDados(tags_name, dom) def cep(self, numero): url = 'http://cep.republicavirtual.com.br/web_cep.php?formato=' \ 'xml&cep=%s' % str(numero) - dom = minidom.parse(urllib2.urlopen(url)) + dom = minidom.parse(urllib.request.urlopen(url)) tags_name = ('uf', 'cidade', @@ -108,6 +122,8 @@ def cep(self, numero): return self._getDados(tags_name, dom) else: return {} + + def encomenda(self, numero): # Usado como referencia o codigo do Guilherme Chapiewski @@ -117,25 +133,47 @@ def encomenda(self, numero): 'P_ITEMCODE=&P_LINGUA=001&P_TESTE=&P_TIPO=001&P_COD_UNI=%s' % \ str(numero) - html = urllib2.urlopen(url).read() - table = re.search(r'', html, re.S).group(0) + html = urllib.request.urlopen(url).read() + + table = re.search(b'', html, re.S).group(0) - parsed = BeautifulSoup(table) + parsed = BeautifulSoup(table, "html.parser") + dados = [] - for count, tr in enumerate(parsed.table): - if count > 4 and str(tr).strip() != '': + for count, tr in enumerate(parsed.findAll('tr')): + if count > 0 and str(tr).strip() != '': if re.match(r'\d{2}/\d{2}/\d{4} \d{2}:\d{2}', tr.contents[0].string): dados.append({ - 'data': unicode(tr.contents[0].string), - 'local': unicode(tr.contents[1].string), - 'status': unicode(tr.contents[2].font.string) + 'data': tr.contents[0].string, + 'local': tr.contents[1].string, + 'status': tr.contents[2].font.string }) else: - dados[len(dados) - 1]['detalhes'] = unicode( - tr.contents[0].string) + dados[len(dados) - 1]['detalhes'] = tr.contents[0].string return dados + + + def _dom_to_object(self, dom): + result ={} + child_tags = [child for child in dom.childNodes if isinstance(child,minidom.Element)] + if not child_tags: + content = ''.join(txt.data.strip() for txt in dom.childNodes if isinstance(txt,minidom.Text)) + return content + else: + tags = set([tag.tagName for tag in child_tags]) + for tagName in tags: + elements = dom.getElementsByTagName(tagName) + if len(elements) > 1: + content = [] + for e in elements: + content.append(self._dom_to_object(e)) + result[dom.tagName] = content + else: + content = self._dom_to_object(elements[0]) + result[tagName]=content + return result diff --git a/setup.py b/setup.py index 6a00153..60532f9 100644 --- a/setup.py +++ b/setup.py @@ -20,9 +20,9 @@ def get_version(version_tuple): # Dirty hack to get version number from pycorreios/__init__.py - we can't # file is read init = os.path.join(os.path.dirname(__file__), 'pycorreios', '__init__.py') -version_line = filter(lambda l: l.startswith('VERSION'), open(init))[0] +version_line = list(filter(lambda l: l.startswith('VERSION'), open(init)))[0] VERSION = get_version(eval(version_line.split('=')[-1])) -print VERSION +print(VERSION) CLASSIFIERS = [ 'Development Status :: 4 - Beta', diff --git a/test/correios_test.py b/test/correios_test.py index 45d9b83..5a97919 100644 --- a/test/correios_test.py +++ b/test/correios_test.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import unittest +from unittest import main from pycorreios.correios import Correios @@ -9,42 +10,35 @@ class CorreiosTest(unittest.TestCase): def test_frete(self): - valor_esperado = { - 'MsgErro': '', - 'PrazoEntrega': u'2', - 'Erro': u'0', - 'ValorValorDeclarado': u'0,00', - 'EntregaDomiciliar': u'S', - 'ValorMaoPropria': u'0,00', - 'EntregaSabado': u'S', - 'Valor': u'62,40', - 'Codigo': u'40010' - } - valor = Correios().frete(Correios.SEDEX, '44001535', '03971010', + + result = Correios().frete(Correios.SEDEX, '09840240', '09820650', 1, 1, 18, 9, 13.5, 0) + valor = float(result['Valor'].replace(',','.')) + self.assertTrue(not result['MsgErro']) + self.assertTrue(valor > 0) + + + def test_frete_servicos(self): + servicos = ','.join(str(i) for i in [Correios.SEDEX, Correios.PAC]) + result = Correios().frete(servicos, '09840240', '09820650', + 1, 1, 18, 9, 13.5, 0) + results = result['Servicos'] + self.assertTrue(len(results)>1) + for servico in results: + self.assertTrue(not servico['MsgErro']) - self.assertDictEqual(valor_esperado, valor) def test_cep(self): - valor_esperado = { - 'tipo_logradouro': u'Rua', - 'bairro': u'Jardim Santa Adelia', - 'cidade': u'S\xe3o Paulo', - 'uf': u'SP', - 'logradouro': u'Pascoal Dias', - } + keys = ['tipo_logradouro','bairro','cidade','uf','logradouro'] valor = Correios().cep('03971010') - self.assertDictEqual(valor_esperado, valor) + self.assertEqual(set(keys), set(valor.keys())) + def test_encomenda(self): + valor = Correios().encomenda('PN569489984BR')[0] + self.assertEqual(valor['status'], 'Entrega Efetuada') - valor_esperado = { - 'data': '03/02/2016 17:57', - 'local': u'CDD ITAJUBA - Itajuba/MG', - 'status': 'Entrega Efetuada', - } - - valor = Correios().encomenda('PJ382325976BR')[0] - self.assertDictEqual(valor_esperado, valor) +if __name__ == '__main__': + main()