Skip to content

Commit aeb801b

Browse files
committed
Se permite soporte de versión 1 y 2
1 parent 24aadda commit aeb801b

29 files changed

Lines changed: 87 additions & 58 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ venv
33
__pycache__
44
*.pyc
55
ejemplo-prueba.py
6+
CLAUDE.md
67

78
# Archivos de documentación
89
docs/_build/

apigatewaycl/api_client/__init__.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,27 @@ class ApiClient:
3535
:param str token: Token de autenticación del usuario. Si no se proporciona,
3636
se intentará obtener de una variable de entorno.
3737
:param str url: URL base de la API. Si no se proporciona, se usará una
38-
URL por defecto.
39-
:param str version: Versión de la API. Si no se proporciona, se usará
40-
una versión por defecto.
38+
URL por defecto según la versión.
39+
:param str version: Versión de la API. Si no se proporciona, se usará v2.
40+
También puede configurarse con la variable de entorno APIGATEWAY_API_VERSION.
4141
:param bool raise_for_status: Si se debe lanzar una excepción automáticamente
4242
para respuestas de error HTTP. Por defecto es True.
4343
'''
4444

45-
__DEFAULT_URL = 'https://legacy.apigateway.cl'
46-
__DEFAULT_VERSION = 'v1'
45+
_url_v1 = 'https://legacy.apigateway.cl'
46+
_url_v2 = 'https://app.apigateway.cl'
4747

4848
def __init__(self, token = None, url = None, version = None, raise_for_status = True):
49+
self.version = version or getenv('APIGATEWAY_API_VERSION', 'v2')
50+
if self.version == 'v1':
51+
self.token_prefix = 'Bearer'
52+
self._default_url = self._url_v1
53+
else:
54+
self.token_prefix = 'Token'
55+
self._default_url = self._url_v2
4956
self.token = self.__validate_token(token)
5057
self.url = self.__validate_url(url)
5158
self.headers = self.__generate_headers()
52-
self.version = version or self.__DEFAULT_VERSION
5359
self.raise_for_status = raise_for_status
5460

5561
def __validate_token(self, token):
@@ -77,7 +83,7 @@ def __validate_url(self, url):
7783
'''
7884
return str(url).strip() if url else getenv(
7985
'APIGATEWAY_API_URL',
80-
self.__DEFAULT_URL).strip()
86+
self._default_url).strip()
8187

8288
def __generate_headers(self):
8389
'''
@@ -90,7 +96,7 @@ def __generate_headers(self):
9096
'User-Agent': 'API Gateway: Cliente de API en Python.',
9197
'Content-Type': 'application/json',
9298
'Accept': 'application/json',
93-
'Authorization': 'Bearer %(token)s' % {'token': self.token}
99+
'Authorization': '%(prefix)s %(token)s' % {'prefix': self.token_prefix, 'token': self.token}
94100
}
95101

96102
def __request(self, method, resource, data = None, headers = None):
@@ -142,10 +148,12 @@ def __check_and_return_response(self, response):
142148
if response.status_code != 200 and self.raise_for_status:
143149
try:
144150
response.raise_for_status()
145-
except HTTPError as error:
151+
except HTTPError:
146152
try:
147153
error = response.json()
148154
message = error.get(
155+
'detail', ''
156+
) or error.get(
149157
'message', ''
150158
) or error.get(
151159
'exception', ''
@@ -157,6 +165,9 @@ def __check_and_return_response(self, response):
157165
raise ApiException('Error HTTP: %(message)s' % {
158166
'message': message
159167
})
168+
if self.version == 'v2':
169+
_original_json = response.json
170+
response.json = lambda: _original_json()['data']
160171
return response
161172

162173
def get(self, resource, headers = None):
@@ -255,8 +266,6 @@ class ApiBase(ABC):
255266
:param dict kwargs: Argumentos adicionales para la autenticación.
256267
'''
257268

258-
auth = {}
259-
260269
def __init__(
261270
self,
262271
api_token = None,
@@ -265,6 +274,7 @@ def __init__(
265274
api_raise_for_status = True,
266275
**kwargs
267276
):
277+
self.auth = {}
268278
self.client = ApiClient(
269279
api_token,
270280
api_url,
@@ -354,7 +364,7 @@ def __is_auth_file_data(self, firma_electronica_base64):
354364
# Intenta decodificar la cadena con validación estricta
355365
base64.b64decode(firma_electronica_base64, validate=True)
356366
return True
357-
except (base64.binascii.Error, ValueError):
367+
except (base64.binascii.Error, ValueError): # type: ignore
358368
return False
359369

360370
def __is_auth_cert_data(self, pem_str):
@@ -405,7 +415,7 @@ def __is_auth_cert_data(self, pem_str):
405415
try:
406416
base64.b64decode(base64_content, validate=True)
407417
return True
408-
except (base64.binascii.Error, ValueError):
418+
except (base64.binascii.Error, ValueError): # type: ignore
409419
return False
410420

411421
def _get_auth_pass(self):

apigatewaycl/api_client/sii/actividades_economicas.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ def listado(self, categoria = None):
4545
'''
4646
url = '/sii/contribuyentes/actividades_economicas'
4747
if categoria is not None:
48-
url += '/%(categoria)s' % {'categoria': categoria}
48+
if self.client.version == 'v1':
49+
url += '/%(categoria)s' % {'categoria': categoria}
50+
else:
51+
url += '?categoria=%(categoria)s' % {'categoria': categoria}
4952
response = self.client.get(url)
5053
return response.json()
5154

apigatewaycl/api_client/sii/portal_mipyme.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ class Dte(PortalMipyme):
9393
ESTADO_RECHAZADO_RECEPTOR = 'RRH' # DTE rechazado por receptor
9494
ESTADO_SIN_REPAROS = 'RSR' # Recibido sin reparos
9595

96+
DTE_TIPOS = {
97+
'33': '33',
98+
'34': '34',
99+
'35': '35',
100+
'36': '36',
101+
'37': '37',
102+
'38': '38',
103+
'39': '39',
104+
}
105+
96106
def get_codigo_dte(self, tipo):
97107
'''
98108
Obtiene el código correspondiente al tipo de DTE.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
name='apigatewaycl',
3535

3636
# Versions should comply with PEP440
37-
version='5.3.0',
37+
version='5.4.0',
3838

3939
description='Cliente para realizar la integración con los servicios web de API Gateway desde Python.',
4040
long_description="\n"+long_description,

tests/run.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ def addFailure(self, test, err):
6161
suite = loader.loadTestsFromName(args.test_case) if args.test_case else loader.discover(tests_dir)
6262

6363
# Ejecutar los tests
64-
runner = unittest.TextTestRunner(failfast=True, resultclass=CustomTestResult)
64+
runner = unittest.TextTestRunner(
65+
failfast=True, resultclass=CustomTestResult # type: ignore
66+
)
6567
try:
6668
runner.run(suite)
6769
except KeyboardInterrupt:

tests/sii/actividades/test_listar_actividades_economicas.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ def setUpClass(cls):
3232
def test_listar_actividades_economicas(self):
3333
try:
3434
listado = self.client.listado()
35-
3635
self.assertIsNotNone(listado)
37-
3836
if self.verbose:
3937
print('test_listado(): listado', listado)
4038
except ApiException as e:

tests/sii/bhe_emitidas/test_anular_bhe_emitida.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#
1919

2020
import unittest
21-
from os import getenv, remove as file_remove
21+
from os import getenv
2222
from datetime import datetime
2323
from apigatewaycl.api_client import ApiException
2424
from apigatewaycl.api_client.sii.bhe import BheEmitidas

tests/sii/bhe_emitidas/test_listar_bhe_emitidas_paginadas_dia.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,14 @@ def test_listar_bhe_emitidas_paginadas_dia(self):
4343
self.contribuyente_rut,
4444
self.periodo,
4545
pagina = pagina,
46-
pagina_sig_codigo = pagina_sig_codigo
46+
pagina_sig_codigo = pagina_sig_codigo if self.client.client.version == 'v1' else None
4747
)
4848
print('test_documentos_paginacion_periodo_mes(): Pagina %(pagina)s documentos %(documentos)s' % {
4949
'pagina': pagina,
5050
'documentos': documentos,
5151
})
52-
pagina_sig_codigo = documentos['pagina_sig_codigo']
52+
if self.client.client.version == 'v1':
53+
pagina_sig_codigo = documentos['pagina_sig_codigo']
5354
pagina += 1
5455
if pagina > documentos['n_paginas']:
5556
break

tests/sii/bhe_emitidas/test_listar_bhes_emitidas.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ def setUpClass(cls):
3737
def test_listar_bhes_emitidas(self):
3838
try:
3939
documentos = self.client.documentos(
40-
self.contribuyente_rut, self.periodo
40+
self.contribuyente_rut, self.periodo,
41+
pagina = 1,
4142
)
4243

4344
self.assertTrue(True)

0 commit comments

Comments
 (0)