diff --git a/.travis.yml b/.travis.yml index 8e1e41c..4de4a34 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,9 @@ language: python +python: + - "2.7" + - "3.6" + before_install: pip install -r requirements.txt -script: nosetests \ No newline at end of file +script: nosetests diff --git a/packtrack/__init__.py b/packtrack/__init__.py index 80d4852..1178f57 100755 --- a/packtrack/__init__.py +++ b/packtrack/__init__.py @@ -1,6 +1,8 @@ -from correios import EncomendaRepository -from royal import RoyalMail -from dhl_gm import DhlGmTracker +from __future__ import absolute_import + +from .correios import EncomendaRepository +from .royal import RoyalMail +from .dhl_gm import DhlGmTracker class Correios(object): diff --git a/packtrack/correios.py b/packtrack/correios.py index 4514751..733d71e 100644 --- a/packtrack/correios.py +++ b/packtrack/correios.py @@ -1,4 +1,6 @@ # coding: utf-8 +from __future__ import absolute_import + from datetime import datetime import re @@ -15,7 +17,7 @@ def get(self, numero, auth=None): return func(numero, **kwargs) def _init_scraper(self, backend): - from scraping import CorreiosWebsiteScraper, CorreiosRastroService + from .scraping import CorreiosWebsiteScraper, CorreiosRastroService if backend is None: backend = 'www2' @@ -36,8 +38,8 @@ def __init__(self, numero): def adicionar_status(self, status): d = datetime self.status.append(status) - t_format = self.validar_data(status.data) - self.status.sort(lambda x, y: 1 if d.strptime(x.data, t_format) > d.strptime(y.data, t_format) else -1) + self.status.sort( + key=lambda x: d.strptime(x.data, self.validar_data(x.data))) def validar_data(self, data): if re.match('^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$', data): diff --git a/packtrack/scraping.py b/packtrack/scraping.py index cf1952d..445ef70 100644 --- a/packtrack/scraping.py +++ b/packtrack/scraping.py @@ -1,15 +1,16 @@ +from __future__ import absolute_import + import os import re -from HTMLParser import HTMLParser -from BeautifulSoup import BeautifulSoup +from bs4 import BeautifulSoup import requests from requests.exceptions import RequestException from zeep import Client as Zeep from zeep.cache import InMemoryCache from zeep.transports import Transport -from correios import Encomenda, Status +from .correios import Encomenda, Status class CorreiosWebsiteScraper(object): @@ -49,30 +50,25 @@ def get_encomenda_info(self, numero): html = response.content if html: - try: - html = html.decode('latin-1') - except UnicodeDecodeError: - pass encomenda = Encomenda(numero) for status in self._get_all_status_from_html(html): encomenda.adicionar_status(status) return encomenda def _text(self, value): - value = BeautifulSoup(value.strip()).text - return value.replace(' ', ' ') + value = BeautifulSoup(value.strip(), 'lxml').text + return value.replace(' ', ' ').replace(u'\xa0',' ') def _get_all_status_from_html(self, html): status = [] - html_parser = HTMLParser() - if ").*', html, re.S) if not html_info: return status table = html_info.group(1) - soup = BeautifulSoup(table) + soup = BeautifulSoup(table, 'lxml') for tr in soup.table: try: @@ -80,15 +76,15 @@ def _get_all_status_from_html(self, html): except AttributeError: continue for td in tds: - content = td.renderContents().replace('\r', ' ') \ - .split('
') - class_ = td['class'] + content = td.renderContents().replace(b'\r', b' ') \ + .split(b'
') + class_ = td['class'][0] if class_ == 'sroDtEvent': - data = '%s %s' % (content[0].strip(), content[1].strip()) + data = '%s %s' % (content[0].strip().decode(), content[1].strip().decode()) local = '/'.join(self._text(content[2]).rsplit(' / ', 1)).upper() elif class_ == 'sroLbEvent': - situacao = html_parser.unescape(self._text(content[0])) - detalhes = html_parser.unescape(self._text(content[1])) + situacao = self._text(content[0].decode('utf-8')) + detalhes = self._text(content[1].decode('utf-8')) if detalhes: detalhes = u'%s %s' % (situacao, detalhes) status.append(Status(data=data, local=local, diff --git a/requirements.txt b/requirements.txt index 5e0d12c..8eb349e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,5 @@ -BeautifulSoup==3.2.1 -argparse==1.2.1 -beautifulsoup4==4.3.2 -lxml==2.3.5 -mockito==0.5.1 +beautifulsoup4==4.6.0 +lxml==3.8.0 +mockito==1.0.12 requests==2.18.1 -wsgiref==0.1.2 zeep==1.6.0 diff --git a/tests/correios_api_test.py b/tests/correios_api_test.py index 9f68a14..5e0dd32 100644 --- a/tests/correios_api_test.py +++ b/tests/correios_api_test.py @@ -1,6 +1,6 @@ import unittest -from mockito import when, Mock +from mockito import when, mock from packtrack import Correios @@ -8,7 +8,7 @@ class CorreiosTest(unittest.TestCase): def test_should_use_repository_to_get_encomenda(self): - encomenda_repository_mock = Mock() + encomenda_repository_mock = mock() when(encomenda_repository_mock).get('123', auth=None) \ .thenReturn('encomenda123') @@ -18,7 +18,7 @@ def test_should_use_repository_to_get_encomenda(self): def test_service_should_receive_auth(self): auth = ('mi', 'mimi') - encomenda_repository_mock = Mock() + encomenda_repository_mock = mock() when(encomenda_repository_mock).get('123', auth=auth) \ .thenReturn('encomenda123') diff --git a/tests/correios_test.py b/tests/correios_test.py index ed27249..2127679 100644 --- a/tests/correios_test.py +++ b/tests/correios_test.py @@ -9,7 +9,7 @@ class EncomendaRepositoryTest(unittest.TestCase): def test_should_get_encomenda_by_numero(self): encomenda_123 = Status(data='2009-01-28 17:49:00') - correios_website_scraper_mock = Mock() + correios_website_scraper_mock = mock() when(correios_website_scraper_mock).get_encomenda_info('123', auth=None).thenReturn(encomenda_123) repository = EncomendaRepository() diff --git a/tests/scraping_test.py b/tests/scraping_test.py index 547c605..5d4faf9 100644 --- a/tests/scraping_test.py +++ b/tests/scraping_test.py @@ -1,7 +1,7 @@ # encoding: UTF-8 import os import unittest - +import io import mock from packtrack.scraping import CorreiosWebsiteScraper @@ -17,7 +17,8 @@ def _assert_status(self, status, data, local, situacao, detalhes): self.assertEqual(detalhes, status.detalhes) def test_should_get_data_from_correios_website(self): - example_file = open('%s/tests/correios_website/exemplo_rastreamento_correios1.html' % os.getcwd()) + example_file = io.open('%s/tests/correios_website/exemplo_rastreamento_correios1.html' % os.getcwd(), + encoding='iso-8859-1') sample_html = example_file.read() example_file.close()