From 4abb80ad06da13a9df60637398718014ea0a328a Mon Sep 17 00:00:00 2001 From: guyskk Date: Tue, 22 Feb 2022 18:12:38 +0800 Subject: [PATCH 1/6] close client session to avoid resource leak --- README.md | 1 + cep/client.py | 3 +++ cep/transferencia.py | 21 +++++++++++++++++---- setup.cfg | 2 +- tests/test_client.py | 1 + tests/test_transferencia.py | 3 +++ 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3a64f46..a57bab5 100644 --- a/README.md +++ b/README.md @@ -29,4 +29,5 @@ tr = Transferencia.validar( monto=8.17, ) pdf = tr.descargar() +tr.close() ``` diff --git a/cep/client.py b/cep/client.py index 9062e14..026aebd 100644 --- a/cep/client.py +++ b/cep/client.py @@ -19,6 +19,9 @@ def __init__(self): tipoConsulta=1, ) + def close(self): + self.session.close() + def get(self, endpoint: str, **kwargs) -> bytes: return self.request('get', endpoint, {}, **kwargs) diff --git a/cep/transferencia.py b/cep/transferencia.py index cd3f469..ae804ae 100644 --- a/cep/transferencia.py +++ b/cep/transferencia.py @@ -76,6 +76,12 @@ def descargar(self, formato: str = 'PDF') -> bytes: def to_dict(self) -> dict: return asdict(self) + def close(self): + client: Optional[Client] = getattr(self, '__client', None) + if client: + client.close() + setattr(self, '__client', None) + @staticmethod def _validar( fecha: datetime.date, @@ -87,7 +93,6 @@ def _validar( ) -> Optional[Client]: assert emisor in clabe.BANKS.values() assert receptor in clabe.BANKS.values() - client = Client() # Use new client to ensure thread-safeness request_body = dict( fecha=fecha.strftime('%d-%m-%Y'), criterio=clave_rastreo, @@ -96,9 +101,17 @@ def _validar( cuenta=cuenta, monto=monto, ) - resp = client.post('/valida.do', request_body) - # None si no pudó validar - return client if b'no encontrada' not in resp else None + # Use new client to ensure thread-safeness + client = Client() + is_success = False + try: + resp = client.post('/valida.do', request_body) + # None si no pudó validar + is_success = b'no encontrada' not in resp + finally: + if not is_success: + client.close() + return client if is_success else None @staticmethod def _descargar(client: Client, formato: str = 'PDF') -> bytes: diff --git a/setup.cfg b/setup.cfg index 4718c66..b351582 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,7 +2,7 @@ test=pytest [tool:pytest] -addopts = -p no:warnings -v --cov-report term-missing --cov=cep +addopts = -W all -v --cov-report term-missing --cov=cep [flake8] inline-quotes = ' diff --git a/tests/test_client.py b/tests/test_client.py index 2a7ba5c..a798f8a 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -6,3 +6,4 @@ def test_http_error(client): with pytest.raises(HTTPError): client.get('/no/existe') + client.close() diff --git a/tests/test_transferencia.py b/tests/test_transferencia.py index 206e5c1..2f71550 100644 --- a/tests/test_transferencia.py +++ b/tests/test_transferencia.py @@ -16,6 +16,7 @@ def test_validar_transferencia(transferencia): cuenta='012180004643051249', monto=8.17, ) + tr.close() assert tr == transferencia assert type(tr.to_dict()) is dict @@ -36,6 +37,7 @@ def test_fail_validar_transferencia(): @pytest.mark.vcr def test_descarga_pdf(transferencia): pdf = transferencia.descargar() + transferencia.close() file_dir = os.path.dirname(__file__) file_path = os.path.join(file_dir, 'CEP-20190412-CUENCA1555093850.pdf') with open(file_path, 'rb') as f: @@ -54,3 +56,4 @@ def test_descagar_transferencia_con_fecha_distinta(transferencia): ) assert type(tr.to_dict()) is dict tr.descargar() + tr.close() From d18ff9b320a17553fdc28c354fa3a1c830f90795 Mon Sep 17 00:00:00 2001 From: guyskk Date: Thu, 3 Mar 2022 18:02:23 +0800 Subject: [PATCH 2/6] implement transferencia client context manager, deprecate Transferencia methods. --- README.md | 24 +- cep/__init__.py | 10 +- cep/client.py | 12 +- cep/transferencia.py | 150 +-- .../test_validar_transferencia_client.yaml | 885 ++++++++++++++++++ tests/conftest.py | 3 +- tests/test_client.py | 1 - tests/test_transferencia.py | 22 +- 8 files changed, 1030 insertions(+), 77 deletions(-) create mode 100644 tests/cassettes/test_validar_transferencia_client.yaml diff --git a/README.md b/README.md index a57bab5..580a2ea 100644 --- a/README.md +++ b/README.md @@ -18,16 +18,16 @@ pip install cepmex ```python from datetime import date -from cep import Transferencia - -tr = Transferencia.validar( - fecha=date(2019, 4, 12), - clave_rastreo='CUENCA1555093850', - emisor='90646', # STP - receptor='40012', # BBVA - cuenta='012180004643051249', - monto=8.17, -) -pdf = tr.descargar() -tr.close() +from cep import TransferenciaClient + +with TransferenciaClient() as client: + tr = client.validar( + fecha=date(2019, 4, 12), + clave_rastreo='CUENCA1555093850', + emisor='90646', # STP + receptor='40012', # BBVA + cuenta='012180004643051249', + monto=8.17, + ) + pdf = client.descargar() ``` diff --git a/cep/__init__.py b/cep/__init__.py index 0075cfe..21baba9 100644 --- a/cep/__init__.py +++ b/cep/__init__.py @@ -1,6 +1,12 @@ -__all__ = ['__version__', 'Cuenta', 'Client', 'Transferencia'] +__all__ = ( + '__version__', + 'Cuenta', + 'Client', + 'Transferencia', + 'TransferenciaClient', +) from .client import Client from .cuenta import Cuenta -from .transferencia import Transferencia +from .transferencia import Transferencia, TransferenciaClient from .version import __version__ diff --git a/cep/client.py b/cep/client.py index 026aebd..1cb509f 100644 --- a/cep/client.py +++ b/cep/client.py @@ -9,8 +9,8 @@ class Client: base_url = 'http://www.banxico.org.mx/cep' - def __init__(self): - self.session = requests.Session() + def __init__(self, session: requests.Session = None): + self.session = session or requests.Session() self.session.headers['User-Agent'] = USER_AGENT self.base_data = dict( tipoCriterio='T', @@ -19,8 +19,12 @@ def __init__(self): tipoConsulta=1, ) - def close(self): - self.session.close() + def __enter__(self): + self.session.__enter__() + return self + + def __exit__(self, *args, **kwargs): + self.session.__exit__(*args, **kwargs) def get(self, endpoint: str, **kwargs) -> bytes: return self.request('get', endpoint, {}, **kwargs) diff --git a/cep/transferencia.py b/cep/transferencia.py index ae804ae..d99e6b5 100644 --- a/cep/transferencia.py +++ b/cep/transferencia.py @@ -3,6 +3,7 @@ from typing import Optional import clabe +import requests from lxml import etree from .client import Client @@ -30,22 +31,93 @@ def validar( receptor: str, cuenta: str, monto: float, - ): - client = cls._validar( - fecha, clave_rastreo, emisor, receptor, cuenta, monto + ) -> Optional["Transferencia"]: + """ + validar CEP. + + Deprecated, use TransferenciaClient instead. + """ + client = TransferenciaClient() + tr = client.validar( + fecha=fecha, + clave_rastreo=clave_rastreo, + emisor=emisor, + receptor=receptor, + cuenta=cuenta, + monto=monto, ) - if not client: + if tr is not None: + setattr(tr, '__client', client) + return tr + + def descargar(self, formato: str = "PDF") -> bytes: + """ + formato puede ser PDF, XML o ZIP. + + Deprecated, use TransferenciaClient instead. + """ + client: Optional[TransferenciaClient] = getattr(self, '__client', None) + if client is None: + client = TransferenciaClient() + client._validar( + fecha=self.fecha_operacion.date(), + clave_rastreo=self.clave_rastreo, + emisor=self.emisor, + receptor=self.receptor, + cuenta=self.beneficiario.numero, + monto=self.monto, + ) + return client.descargar(formato) + + def to_dict(self) -> dict: + return asdict(self) + + +class TransferenciaClient: + """ + Python client library for CEP (http://www.banxico.org.mx/cep/) + """ + + def __init__(self, session: requests.Session = None) -> None: + self.__client = Client(session=session) + + def __enter__(self): + self.__client.__enter__() + return self + + def __exit__(self, *args, **kwargs): + self.__client.__exit__(*args, **kwargs) + + def validar( + self, + fecha: datetime.date, + clave_rastreo: str, + emisor: str, + receptor: str, + cuenta: str, + monto: float, + ) -> Optional[Transferencia]: + """validar CEP.""" + is_success = self._validar( + fecha=fecha, + clave_rastreo=clave_rastreo, + emisor=emisor, + receptor=receptor, + cuenta=cuenta, + monto=monto, + ) + if not is_success: return None - xml = cls._descargar(client, 'XML') + xml = self._descargar("XML") resp = etree.fromstring(xml) - ordenante = Cuenta.from_etree(resp.find('Ordenante')) - beneficiario = Cuenta.from_etree(resp.find('Beneficiario')) - concepto = resp.find('Beneficiario').get('Concepto') + ordenante = Cuenta.from_etree(resp.find("Ordenante")) + beneficiario = Cuenta.from_etree(resp.find("Beneficiario")) + concepto = resp.find("Beneficiario").get("Concepto") fecha_operacion = datetime.datetime.fromisoformat( - str(fecha) + ' ' + resp.get('Hora') + str(fecha) + " " + resp.get("Hora") ) - transferencia = cls( + transferencia = Transferencia( fecha_operacion=fecha_operacion, ordenante=ordenante, beneficiario=beneficiario, @@ -54,66 +126,38 @@ def validar( clave_rastreo=clave_rastreo, emisor=emisor, receptor=receptor, - sello=resp.get('sello'), + sello=resp.get("sello"), ) - setattr(transferencia, '__client', client) return transferencia - def descargar(self, formato: str = 'PDF') -> bytes: - """formato puede ser PDF, XML o ZIP""" - client = getattr(self, '__client', None) - if not client: - client = self._validar( - self.fecha_operacion.date(), - self.clave_rastreo, - self.emisor, - self.receptor, - self.beneficiario.numero, - self.monto, - ) - return self._descargar(client, formato) + def descargar(self, formato: str = "PDF") -> bytes: + """formato puede ser PDF, XML o ZIP.""" + return self._descargar(formato) - def to_dict(self) -> dict: - return asdict(self) - - def close(self): - client: Optional[Client] = getattr(self, '__client', None) - if client: - client.close() - setattr(self, '__client', None) - - @staticmethod def _validar( + self, fecha: datetime.date, clave_rastreo: str, emisor: str, receptor: str, cuenta: str, monto: float, - ) -> Optional[Client]: + ) -> bool: assert emisor in clabe.BANKS.values() assert receptor in clabe.BANKS.values() request_body = dict( - fecha=fecha.strftime('%d-%m-%Y'), + fecha=fecha.strftime("%d-%m-%Y"), criterio=clave_rastreo, emisor=emisor, receptor=receptor, cuenta=cuenta, monto=monto, ) - # Use new client to ensure thread-safeness - client = Client() - is_success = False - try: - resp = client.post('/valida.do', request_body) - # None si no pudó validar - is_success = b'no encontrada' not in resp - finally: - if not is_success: - client.close() - return client if is_success else None - - @staticmethod - def _descargar(client: Client, formato: str = 'PDF') -> bytes: - """formato puede ser PDF, XML o ZIP""" - return client.get(f'/descarga.do?formato={formato}') + resp = self.__client.post("/valida.do", request_body) + # None si no pudó validar + is_success = b"no encontrada" not in resp + return is_success + + def _descargar(self, formato: str = "PDF") -> bytes: + """formato puede ser PDF, XML o ZIP.""" + return self.__client.get(f"/descarga.do?formato={formato}") diff --git a/tests/cassettes/test_validar_transferencia_client.yaml b/tests/cassettes/test_validar_transferencia_client.yaml new file mode 100644 index 0000000..7d9a46a --- /dev/null +++ b/tests/cassettes/test_validar_transferencia_client.yaml @@ -0,0 +1,885 @@ +interactions: +- request: + body: tipoCriterio=T&receptorParticipante=0&captcha=c&tipoConsulta=1&fecha=12-04-2019&criterio=CUENCA1555093850&emisor=90646&receptor=40012&cuenta=012180004643051249&monto=8.17 + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '170' + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, + like Gecko) Chrome/75.0.3770.142 Safari/537.36 + method: POST + uri: http://www.banxico.org.mx/cep/valida.do + response: + body: + string: '' + headers: + Connection: + - close + Content-Length: + - '0' + Location: + - https://www.banxico.org.mx/cep/valida.do + Server: + - mxbanxico + status: + code: 307 + message: Temporary Redirect +- request: + body: tipoCriterio=T&receptorParticipante=0&captcha=c&tipoConsulta=1&fecha=12-04-2019&criterio=CUENCA1555093850&emisor=90646&receptor=40012&cuenta=012180004643051249&monto=8.17 + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '170' + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, + like Gecko) Chrome/75.0.3770.142 Safari/537.36 + method: POST + uri: https://127.0.0.1:7890/cep/valida.do + response: + body: + string: "\n
\n \n Descargar CEP\n
\n
\n

Gracias + por utilizar el servicio de descarga de CEP

\n \n
Haga clic sobre el + ícono para descargar el CEP.

\n PDF\n \n XML\n \n + \ ZIP\n \n + \
\n \n
" + headers: + Content-Language: + - es-MX + Content-Length: + - '1508' + Content-Type: + - text/html; charset=UTF-8 + Date: + - Thu, 03 Mar 2022 09:40:52 GMT + Set-Cookie: + - JSESSIONID=MUBPJ1azSv9Oap3-AsHSMRmTswoDsuvyzq9I1IewvpD9UY6MDbul!49415753; + path=/; HttpOnly + - Hex39714011=!85IvG/nbTZuEtAP3AjKmtUwBnOY1ofDlmtoh15F02uRuWE1nmG/dPKW0qJtsHv10m/3Kfl8yA1qYsw==; + expires=Thu, 03-Mar-2022 17:40:52 GMT; path=/; Httponly + - TS012f422b=01ab44a5a861da1c8999fba3041cc11820c28623c4d869f8cd8b37538328a4479e6c4c18a564b401cce54f8e4f9b47bc514b895411ca1ff3bcf313bf6b7f5514a588eee9940fb78336f43863903a5585f09c42d405; + Path=/ + X-OPNET-Transaction-Trace: + - a2_3faec8d3-845a-48f6-ade5-39da255203cb + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - Hex39714011=!85IvG/nbTZuEtAP3AjKmtUwBnOY1ofDlmtoh15F02uRuWE1nmG/dPKW0qJtsHv10m/3Kfl8yA1qYsw==; + JSESSIONID=MUBPJ1azSv9Oap3-AsHSMRmTswoDsuvyzq9I1IewvpD9UY6MDbul!49415753; + TS012f422b=01ab44a5a861da1c8999fba3041cc11820c28623c4d869f8cd8b37538328a4479e6c4c18a564b401cce54f8e4f9b47bc514b895411ca1ff3bcf313bf6b7f5514a588eee9940fb78336f43863903a5585f09c42d405 + User-Agent: + - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, + like Gecko) Chrome/75.0.3770.142 Safari/537.36 + method: GET + uri: http://www.banxico.org.mx/cep/descarga.do?formato=XML + response: + body: + string: '' + headers: + Connection: + - close + Content-Length: + - '0' + Location: + - https://www.banxico.org.mx/cep/descarga.do?formato=XML + Server: + - mxbanxico + status: + code: 307 + message: Temporary Redirect +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - Hex39714011=!85IvG/nbTZuEtAP3AjKmtUwBnOY1ofDlmtoh15F02uRuWE1nmG/dPKW0qJtsHv10m/3Kfl8yA1qYsw==; + JSESSIONID=MUBPJ1azSv9Oap3-AsHSMRmTswoDsuvyzq9I1IewvpD9UY6MDbul!49415753; + TS012f422b=01ab44a5a861da1c8999fba3041cc11820c28623c4d869f8cd8b37538328a4479e6c4c18a564b401cce54f8e4f9b47bc514b895411ca1ff3bcf313bf6b7f5514a588eee9940fb78336f43863903a5585f09c42d405 + User-Agent: + - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, + like Gecko) Chrome/75.0.3770.142 Safari/537.36 + method: GET + uri: https://127.0.0.1:7890/cep/descarga.do?formato=XML + response: + body: + string: "\r\n\r\n \r\n + \ \r\n" + headers: + Content-Disposition: + - attachment; filename=CEP-20190412-CUENCA1555093850.xml + Content-Language: + - es-MX + Content-Length: + - '1444' + Content-Type: + - application/xml + Date: + - Thu, 03 Mar 2022 09:40:54 GMT + Set-Cookie: + - SRVCOOKIE=!60YM6rwSstKjfJn3AjKmtUwBnOY1oS3klrwfd+fAz4niLWfihOnrbmHTjY8xVsrxvZRnwIZJbeKxSQ==; + expires=Thu, 03-Mar-2022 17:40:54 GMT; path=/; Httponly + - TS012f422b=01ab44a5a889de3cd43934dad4f1fd28c56d8558c2d869f8cd8b37538328a4479e6c4c18a564b401cce54f8e4f9b47bc514b895411ca1ff3bcf313bf6b7f5514a588eee994eb179dbfc128e1dd0bb1818c5f85c34ab0537dcfab721314d5e55399025732fe; + Path=/ + X-OPNET-Transaction-Trace: + - a2_a987da21-3590-4388-a778-c7820472d2cd + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - Hex39714011=!85IvG/nbTZuEtAP3AjKmtUwBnOY1ofDlmtoh15F02uRuWE1nmG/dPKW0qJtsHv10m/3Kfl8yA1qYsw==; + JSESSIONID=MUBPJ1azSv9Oap3-AsHSMRmTswoDsuvyzq9I1IewvpD9UY6MDbul!49415753; + SRVCOOKIE=!60YM6rwSstKjfJn3AjKmtUwBnOY1oS3klrwfd+fAz4niLWfihOnrbmHTjY8xVsrxvZRnwIZJbeKxSQ==; + TS012f422b=01ab44a5a889de3cd43934dad4f1fd28c56d8558c2d869f8cd8b37538328a4479e6c4c18a564b401cce54f8e4f9b47bc514b895411ca1ff3bcf313bf6b7f5514a588eee994eb179dbfc128e1dd0bb1818c5f85c34ab0537dcfab721314d5e55399025732fe + User-Agent: + - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, + like Gecko) Chrome/75.0.3770.142 Safari/537.36 + method: GET + uri: http://www.banxico.org.mx/cep/descarga.do?formato=PDF + response: + body: + string: '' + headers: + Connection: + - close + Content-Length: + - '0' + Location: + - https://www.banxico.org.mx/cep/descarga.do?formato=PDF + Server: + - mxbanxico + status: + code: 307 + message: Temporary Redirect +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - Hex39714011=!85IvG/nbTZuEtAP3AjKmtUwBnOY1ofDlmtoh15F02uRuWE1nmG/dPKW0qJtsHv10m/3Kfl8yA1qYsw==; + JSESSIONID=MUBPJ1azSv9Oap3-AsHSMRmTswoDsuvyzq9I1IewvpD9UY6MDbul!49415753; + SRVCOOKIE=!60YM6rwSstKjfJn3AjKmtUwBnOY1oS3klrwfd+fAz4niLWfihOnrbmHTjY8xVsrxvZRnwIZJbeKxSQ==; + TS012f422b=01ab44a5a889de3cd43934dad4f1fd28c56d8558c2d869f8cd8b37538328a4479e6c4c18a564b401cce54f8e4f9b47bc514b895411ca1ff3bcf313bf6b7f5514a588eee994eb179dbfc128e1dd0bb1818c5f85c34ab0537dcfab721314d5e55399025732fe + User-Agent: + - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, + like Gecko) Chrome/75.0.3770.142 Safari/537.36 + method: GET + uri: https://127.0.0.1:7890/cep/descarga.do?formato=PDF + response: + body: + string: !!binary | + JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9Db2xvclNwYWNlL0RldmljZVJHQi9TdWJ0eXBlL0lt + YWdlL0hlaWdodCAyMzQvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9EZWNvZGVQYXJt + czw8L0NvbHVtbnMgNzIwL0NvbG9ycyAzL1ByZWRpY3RvciAxNS9CaXRzUGVyQ29tcG9uZW50IDg+ + Pi9XaWR0aCA3MjAvTGVuZ3RoIDMxNjIwL0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnja7J0H + QFvH/cdPC0lIgNhiCLH3sM2yzfKMHa/YjlfsxEmcZo82aZNmNm3zz2jarDar2Ykbj9iO7cQ7Xtjg + vQCDDUhiib0ECBCa/xOCpychlg0S4/fJq/ve0xt3v/d497273/2OotPpEAAAAAAAwGhCBRMAAAAA + AACCAwAAAAAAEBwAAAAAAAAgOAAAAAAAAMEBAAAAAAAIDgAAAAAAABAcAAAAAACA4AAAAAAAAADB + AQAAAAAACA4AAAAAAEBwAAAAAAAAgOAAAAAAAAAEBwAAAAAAIDgAAAAAAABGAPrEzp5Op+voULa1 + KVpbOltau1pbO9taOxWdaq1Wp9Fo8b940csuOpVBo9LoVBpNv9gxaR5uDm4eXDc3LpfLpFAo8KIA + AHA7H6KmpiaJSNTW1qajUJycnIKDg3k8HlgGAMExLv+e6+raSksby0obSyQNJSUNjY0dLbKOlpZO + jUZ3O1dmsuh8TycPT66nh4O7YXHj8r2cgoLd7ezo8AIBADAAXV1dZ7KysrKzm5ubzX5y9/BIT09P + Tk6m0+FLAkwKKLioHo/p1mp1xcW1F8+XiYprS0qaxOJ6hUJlVaVGp0bFeE+dIoiL842J8+Hx7MeC + Wa5fr6ytbZs4cphOpdNphn/t6DQXN3sPD0cGgzZW0qeUo4oD8BEZAVhuyGfOsCoYx48X2iqxTAYt + NT1kKEeWlJRs/uEHmUyG17lcbmhIiIubG/7m1tfXFxUXd3R04P18T8+NDzzA5/PhLQBAcIwtGhrk + 58+XnD9XcjZb0tzcMXYSJhS6Tp3qOyM1aObMQDbbzlbJePWVvYcO5E/sVxZrDm9fR19vHt/LycvH + yd/fLSzMk8Vi2CApMhH6MQQ+IiOAVwRaWTD0w1UqzYykf9gqsU5OrGMnnxv0MLFI9MUXX6hUKm8f + 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 + NpbrMOJ0eORKgWJ/4cDVQsSCBovNdh5sMMckrn7Wa0DpYNn6SfGR8uqXUOZFYeqHEO7z09gu1N7Q + DUFmiLysA9RUQa7L7ijU2yWPhaik6/Y29I6xgIX6SF9VSwa+l8Z/hpBbOnrRfFsBrRPM/HTy8oh6 + XFpODXeyU4HA4kAoGgqJGYQmLeTX7VMBSc2TXXVogqr6LCPPZzO5//oONcV9hJIM+UkaSw9iwFDo + RDRloLjdUbpSitNaiNQ80QQBZas44oz9NrxTLIwCSsae7jOJuQtx21aHKkpyrQeQuCxCT+XcxVKb + pkHoKlIPm6CdoZaHzRIw6aOfQSo7EQIbpRKMNC0YdFntDJJdEjVjH6lwOOYgxmLeGM9bu5dN9Wrv + wTRqGZxMiUAskxQiWFxVmyBCdcwDK1EH4nFzaMGRJ+ka5RRcBSW+1qf+rgy4XOgnBeOpfIgS8EOQ + /jtqSZXEwUg/X/xQGTBBWZKprjLR3qcfQ2idASho0JNRKOIofO3EgVisE2Ib9rSwlNmukwvrcrUr + QdipfXgrW/oRZ4C8rB8h4Xk+tL59pBrg28xXvIBuHmSxlwQ4aStKdlAfbOcLrQYQZJbnRzMvnufb + L/dWfcio6EYswqR44LpYVkjj7kqylhSUigmwPmwyCfjxj2SJd0HdQJY6l0uM6ZhATJcWHHBXGQM4 + ANEF6og+yDuueKVo2KJC2Rs8SO0NsLf2Mr15lnlhfzdaqD80klz5VgCBVUYoUocY4Y6ySO6EcF/T + j78v1IdDDdN9LSo2R6KqmgdELb48Fg/jdRFucwbuRF+MO7mKXwF4UPwAnqGFSScEGNsA6OG/It8p + 0Yy1A/9h7EAtj4rqSqI6jW6UQLGl3FhtPoj9WZyA+y4U2WaGtZLIid/+GY6lKjHDtf5uQ2yb6oCM + swVf2zv9rvoEmNxa94ieM7wYCpGVEP4HFi3CHgplbmRzdHJlYW0KZW5kb2JqCjEgMCBvYmoKPDwv + R3JvdXA8PC9TL1RyYW5zcGFyZW5jeS9UeXBlL0dyb3VwL0NTL0RldmljZVJHQj4+L0NvbnRlbnRz + IDQgMCBSL1R5cGUvUGFnZS9SZXNvdXJjZXM8PC9Db2xvclNwYWNlPDwvQ1MvRGV2aWNlUkdCPj4v + UHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0vRm9udDw8L0YxIDIg + MCBSPj4vWE9iamVjdDw8L2ltZzAgMyAwIFI+Pj4+L1BhcmVudCA1IDAgUi9NZWRpYUJveFswIDAg + NTk1IDg1MF0+PgplbmRvYmoKNiAwIG9iagpbMSAwIFIvWFlaIDAgODYwIDBdCmVuZG9iagoyIDAg + b2JqCjw8L1N1YnR5cGUvVHlwZTEvVHlwZS9Gb250L0Jhc2VGb250L0hlbHZldGljYS9FbmNvZGlu + Zy9XaW5BbnNpRW5jb2Rpbmc+PgplbmRvYmoKNSAwIG9iago8PC9LaWRzWzEgMCBSXS9UeXBlL1Bh + Z2VzL0NvdW50IDEvSVRYVCgyLjEuNyk+PgplbmRvYmoKNyAwIG9iago8PC9OYW1lc1soSlJfUEFH + RV9BTkNIT1JfMF8xKSA2IDAgUl0+PgplbmRvYmoKOCAwIG9iago8PC9EZXN0cyA3IDAgUj4+CmVu + ZG9iago5IDAgb2JqCjw8L05hbWVzIDggMCBSL1R5cGUvQ2F0YWxvZy9QYWdlcyA1IDAgUi9WaWV3 + ZXJQcmVmZXJlbmNlczw8L1ByaW50U2NhbGluZy9BcHBEZWZhdWx0Pj4+PgplbmRvYmoKMTAgMCBv + YmoKPDwvTW9kRGF0ZShEOjIwMjIwMzAzMDM0MDU1LTA2JzAwJykvQ3JlYXRvcihKYXNwZXJSZXBv + cnRzIFwocmVwb3J0IG5hbWVcKSkvQ3JlYXRpb25EYXRlKEQ6MjAyMjAzMDMwMzQwNTUtMDYnMDAn + KS9Qcm9kdWNlcihpVGV4dCAyLjEuNyBieSAxVDNYVCk+PgplbmRvYmoKeHJlZgowIDExCjAwMDAw + MDAwMDAgNjU1MzUgZiAKMDAwMDAzNDQ3NCAwMDAwMCBuIAowMDAwMDM0NzY2IDAwMDAwIG4gCjAw + MDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAzMTg2MSAwMDAwMCBuIAowMDAwMDM0ODU0IDAwMDAwIG4g + CjAwMDAwMzQ3MzEgMDAwMDAgbiAKMDAwMDAzNDkxNyAwMDAwMCBuIAowMDAwMDM0OTcxIDAwMDAw + IG4gCjAwMDAwMzUwMDMgMDAwMDAgbiAKMDAwMDAzNTEwNiAwMDAwMCBuIAp0cmFpbGVyCjw8L0lu + Zm8gMTAgMCBSL0lEIFs8ZGU4NmU3YTZjM2JkODhkYjM3ZWNlMTg4NDQ1M2MyYjA+PDFhZWQ0YmNh + ZTYzYjVlNWNhNTkwZjNjMjNmOGEwNTdmPl0vUm9vdCA5IDAgUi9TaXplIDExPj4Kc3RhcnR4cmVm + CjM1MjY4CiUlRU9GCg== + headers: + Content-Disposition: + - attachment; filename=CEP-20190412-CUENCA1555093850.pdf + Content-Language: + - es-MX + Content-Length: + - '35638' + Content-Type: + - application/pdf + Date: + - Thu, 03 Mar 2022 09:40:55 GMT + Set-Cookie: + - SRVCOOKIE=!dqfBqYpzJa7+S7X3AjKmtUwBnOY1oa28qOBPfDY1ZVuiMQcQu9JFfUO/6wu3iff8WOMOpF/jLFfkrw==; + expires=Thu, 03-Mar-2022 17:40:55 GMT; path=/; Httponly + - TS012f422b=01ab44a5a8666f3c36980265eb9e0fce41a0f2d88ad869f8cd8b37538328a4479e6c4c18a564b401cce54f8e4f9b47bc514b895411ca1ff3bcf313bf6b7f5514a588eee994eb179dbfc128e1dd0bb1818c5f85c34a688889f697365b57e49a592755d65cd6; + Path=/ + X-OPNET-Transaction-Trace: + - a2_73c84bf4-51f7-4e61-bf20-b2c39985d96b + X-ORACLE-DMS-ECID: + - 19d2b136-ca97-4f79-aec4-2917cb00aad6-00058d06 + X-ORACLE-DMS-RID: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/conftest.py b/tests/conftest.py index f67f722..7b11a82 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,7 +7,8 @@ @pytest.fixture def client(): - yield Client() + with Client() as instance: + yield instance @pytest.fixture diff --git a/tests/test_client.py b/tests/test_client.py index a798f8a..2a7ba5c 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -6,4 +6,3 @@ def test_http_error(client): with pytest.raises(HTTPError): client.get('/no/existe') - client.close() diff --git a/tests/test_transferencia.py b/tests/test_transferencia.py index 2f71550..9aee354 100644 --- a/tests/test_transferencia.py +++ b/tests/test_transferencia.py @@ -3,7 +3,7 @@ import pytest -from cep import Transferencia +from cep import Transferencia, TransferenciaClient @pytest.mark.vcr @@ -16,11 +16,27 @@ def test_validar_transferencia(transferencia): cuenta='012180004643051249', monto=8.17, ) - tr.close() assert tr == transferencia assert type(tr.to_dict()) is dict +@pytest.mark.vcr +def test_validar_transferencia_client(transferencia): + with TransferenciaClient() as client: + tr = client.validar( + fecha=dt.date(2019, 4, 12), + clave_rastreo='CUENCA1555093850', + emisor='90646', # STP + receptor='40012', # BBVA + cuenta='012180004643051249', + monto=8.17, + ) + pdf = client.descargar() + assert tr == transferencia + assert type(tr.to_dict()) is dict + assert type(pdf) is bytes + + @pytest.mark.vcr def test_fail_validar_transferencia(): tr = Transferencia.validar( @@ -37,7 +53,6 @@ def test_fail_validar_transferencia(): @pytest.mark.vcr def test_descarga_pdf(transferencia): pdf = transferencia.descargar() - transferencia.close() file_dir = os.path.dirname(__file__) file_path = os.path.join(file_dir, 'CEP-20190412-CUENCA1555093850.pdf') with open(file_path, 'rb') as f: @@ -56,4 +71,3 @@ def test_descagar_transferencia_con_fecha_distinta(transferencia): ) assert type(tr.to_dict()) is dict tr.descargar() - tr.close() From da407e29a13181a441e8ff3f04b097f29fa32852 Mon Sep 17 00:00:00 2001 From: guyskk Date: Thu, 3 Mar 2022 18:06:19 +0800 Subject: [PATCH 3/6] add doc for confirure requests session instance --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 580a2ea..283ec80 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ pip install cepmex ```python from datetime import date +import requests from cep import TransferenciaClient with TransferenciaClient() as client: @@ -30,4 +31,8 @@ with TransferenciaClient() as client: monto=8.17, ) pdf = client.descargar() + +# Optional: confirure requests session instance +session = requests.Session() +client = TransferenciaClient(session) ``` From a3d2804de7e940a813b63012ab11570d56d69044 Mon Sep 17 00:00:00 2001 From: guyskk Date: Thu, 3 Mar 2022 18:13:26 +0800 Subject: [PATCH 4/6] reserve comments --- cep/transferencia.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/cep/transferencia.py b/cep/transferencia.py index d99e6b5..63f5f5c 100644 --- a/cep/transferencia.py +++ b/cep/transferencia.py @@ -31,12 +31,13 @@ def validar( receptor: str, cuenta: str, monto: float, - ) -> Optional["Transferencia"]: + ) -> Optional['Transferencia']: """ validar CEP. Deprecated, use TransferenciaClient instead. """ + # Use new client to ensure thread-safeness client = TransferenciaClient() tr = client.validar( fecha=fecha, @@ -50,7 +51,7 @@ def validar( setattr(tr, '__client', client) return tr - def descargar(self, formato: str = "PDF") -> bytes: + def descargar(self, formato: str = 'PDF') -> bytes: """ formato puede ser PDF, XML o ZIP. @@ -108,14 +109,14 @@ def validar( ) if not is_success: return None - xml = self._descargar("XML") + xml = self._descargar('XML') resp = etree.fromstring(xml) - ordenante = Cuenta.from_etree(resp.find("Ordenante")) - beneficiario = Cuenta.from_etree(resp.find("Beneficiario")) - concepto = resp.find("Beneficiario").get("Concepto") + ordenante = Cuenta.from_etree(resp.find('Ordenante')) + beneficiario = Cuenta.from_etree(resp.find('Beneficiario')) + concepto = resp.find('Beneficiario').get('Concepto') fecha_operacion = datetime.datetime.fromisoformat( - str(fecha) + " " + resp.get("Hora") + str(fecha) + " " + resp.get('Hora') ) transferencia = Transferencia( fecha_operacion=fecha_operacion, @@ -126,11 +127,11 @@ def validar( clave_rastreo=clave_rastreo, emisor=emisor, receptor=receptor, - sello=resp.get("sello"), + sello=resp.get('sello'), ) return transferencia - def descargar(self, formato: str = "PDF") -> bytes: + def descargar(self, formato: str = 'PDF') -> bytes: """formato puede ser PDF, XML o ZIP.""" return self._descargar(formato) @@ -158,6 +159,6 @@ def _validar( is_success = b"no encontrada" not in resp return is_success - def _descargar(self, formato: str = "PDF") -> bytes: + def _descargar(self, formato: str = 'PDF') -> bytes: """formato puede ser PDF, XML o ZIP.""" return self.__client.get(f"/descarga.do?formato={formato}") From ee4efa8b759b7c42fa31a3b39964a3635e79531e Mon Sep 17 00:00:00 2001 From: guyskk Date: Thu, 3 Mar 2022 18:19:58 +0800 Subject: [PATCH 5/6] typo: confirure -> configure --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 283ec80..6daccc7 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ with TransferenciaClient() as client: ) pdf = client.descargar() -# Optional: confirure requests session instance +# Optional: configure requests session instance session = requests.Session() client = TransferenciaClient(session) ``` From e9e6b7a675dcb2c2ff3fc7f55afbe4d25b67b937 Mon Sep 17 00:00:00 2001 From: guyskk Date: Mon, 7 Mar 2022 10:49:29 +0800 Subject: [PATCH 6/6] bump version 0.2.0 --- cep/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cep/version.py b/cep/version.py index 124e462..7fd229a 100644 --- a/cep/version.py +++ b/cep/version.py @@ -1 +1 @@ -__version__ = '0.1.7' +__version__ = '0.2.0'