Skip to content

Commit 2af3c7e

Browse files
authored
Add types (#17)
1 parent f8ab9b7 commit 2af3c7e

File tree

9 files changed

+190
-65
lines changed

9 files changed

+190
-65
lines changed

.github/workflows/test.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,8 @@ jobs:
3030
cache: 'poetry'
3131
- name: Install dependencies
3232
run: poetry install
33-
- name: test code
33+
- name: Type checking
34+
# Mypy configuration defined in pyproject.toml
35+
run: poetry run mypy
36+
- name: Run tests
3437
run: poetry run pytest

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
### Changed
99
- improved the documentation.
1010
- Added github action to release the package.
11+
- Added types to IdApi, ServerError, Utilities, and WebApi classes
1112

1213
## [1.0.9] - 2022-11-01
1314
### Added
@@ -52,4 +53,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5253
- Fixed python semantics.
5354
- Moved zipfile out from webapi class.
5455

55-
## [0.0.12] - 2022-08-19
56+
## [0.0.12] - 2022-08-19

poetry.lock

Lines changed: 72 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@ pycryptodome = "3.9.8"
2929
pytest = "^7.0.0"
3030
responses = "0.13.3"
3131
black = "22.8.0"
32+
mypy = "^0.971"
33+
types-requests = "^2.28.11.2"
34+
35+
[tool.mypy]
36+
files = "smile_id_core,tests"
37+
pretty = true
38+
show_error_codes = true
39+
strict_equality = true
40+
warn_unused_configs = true
41+
warn_redundant_casts = true
42+
warn_unused_ignores = true
43+
warn_no_return = true
44+
warn_unreachable = true
3245

3346
[build-system]
3447
requires = ["poetry-core"]

smile_id_core/IdApi.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import json
2-
from typing import Dict
2+
from typing import Optional, Dict, Union
3+
4+
from requests import Response
35

46
from smile_id_core.Utilities import (
57
Utilities,
@@ -14,23 +16,23 @@
1416

1517

1618
class IdApi:
17-
def __init__(self, partner_id: str, api_key: str, sid_server: str or int):
19+
def __init__(self, partner_id: str, api_key: str, sid_server: Union[str, int]):
1820
if not partner_id or not api_key:
1921
raise ValueError("partner_id or api_key cannot be null or empty")
2022
self.partner_id = partner_id
2123
self.api_key = api_key
2224
if sid_server in [0, 1, "0", "1"]:
2325
self.url = sid_server_map[int(sid_server)]
2426
else:
25-
self.url = sid_server
27+
self.url = str(sid_server)
2628

2729
def submit_job(
2830
self,
2931
partner_params: Dict,
3032
id_params: Dict,
3133
use_validation_api=True,
32-
options_params: Dict = None,
33-
):
34+
options_params: Optional[Dict] = None,
35+
) -> Response:
3436
if not options_params:
3537
options_params = {}
3638

@@ -59,7 +61,9 @@ def submit_job(
5961
)
6062
return response
6163

62-
def __configure_json(self, partner_params, id_params, sec_key):
64+
def __configure_json(
65+
self, partner_params: Dict, id_params: Dict, sec_key: Dict
66+
) -> Dict:
6367
validate_sec_params(sec_key)
6468
payload = {
6569
**sec_key,
@@ -69,7 +73,7 @@ def __configure_json(self, partner_params, id_params, sec_key):
6973
payload.update(id_params)
7074
return payload
7175

72-
def __execute_http(self, payload):
76+
def __execute_http(self, payload: Dict) -> Response:
7377
data = json.dumps(payload)
7478
resp = requests.post(
7579
url=f"{self.url}/id_verification",

smile_id_core/ServerError.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33

44
class ServerError(Exception):
5-
def __init__(self, message):
5+
def __init__(self, message: str):
66
self.message = message

smile_id_core/Utilities.py

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import json
2-
from typing import Dict
2+
from typing import Union, Optional, Dict
33

44
import requests
5+
from requests import Response
56

67
from smile_id_core.Signature import Signature
78
from smile_id_core.ServerError import ServerError
@@ -15,18 +16,23 @@
1516

1617

1718
class Utilities:
18-
def __init__(self, partner_id, api_key, sid_server):
19+
def __init__(self, partner_id: str, api_key: str, sid_server: Union[int, str]):
1920
if not partner_id or not api_key:
2021
raise ValueError("partner_id or api_key cannot be null or empty")
2122
self.partner_id = partner_id
2223
self.api_key = api_key
2324
self.sid_server = sid_server
24-
if sid_server in [0, 1]:
25-
self.url = sid_server_map[sid_server]
25+
if sid_server in [0, 1, "0", "1"]:
26+
self.url = sid_server_map[int(sid_server)]
2627
else:
27-
self.url = sid_server
28-
29-
def get_job_status(self, partner_params, option_params, sec_params=None):
28+
self.url = str(sid_server)
29+
30+
def get_job_status(
31+
self,
32+
partner_params: Dict,
33+
option_params: Dict,
34+
sec_params: Optional[Dict] = None,
35+
) -> Response:
3036
if sec_params is None:
3137
sec_params = get_signature(
3238
self.partner_id, self.api_key, option_params.get("signature")
@@ -47,13 +53,15 @@ def get_job_status(self, partner_params, option_params, sec_params=None):
4753
else:
4854
options = option_params
4955
return self.__query_job_status(
50-
partner_params.get("user_id"),
51-
partner_params.get("job_id"),
56+
str(partner_params.get("user_id")),
57+
str(partner_params.get("job_id")),
5258
options,
5359
sec_params,
5460
)
5561

56-
def __query_job_status(self, user_id, job_id, option_params, sec_params):
62+
def __query_job_status(
63+
self, user_id: str, job_id: str, option_params: Dict, sec_params: Dict
64+
) -> Response:
5765
job_status = Utilities.execute_post(
5866
f"{self.url}/job_status",
5967
self.__configure_job_query(user_id, job_id, option_params, sec_params),
@@ -77,7 +85,9 @@ def __query_job_status(self, user_id, job_id, option_params, sec_params):
7785
)
7886
return job_status
7987

80-
def __configure_job_query(self, user_id, job_id, options, sec_params):
88+
def __configure_job_query(
89+
self, user_id: str, job_id: str, options: Dict, sec_params: Dict
90+
) -> Dict:
8191
return {
8292
**sec_params,
8393
"partner_id": self.partner_id,
@@ -88,7 +98,7 @@ def __configure_job_query(self, user_id, job_id, options, sec_params):
8898
}
8999

90100
@staticmethod
91-
def validate_partner_params(partner_params):
101+
def validate_partner_params(partner_params: Dict) -> None:
92102
if not partner_params:
93103
raise ValueError("Please ensure that you send through partner params")
94104

@@ -110,8 +120,11 @@ def validate_partner_params(partner_params):
110120

111121
@staticmethod
112122
def validate_id_params(
113-
sid_server, id_info_params, partner_params, use_validation_api=False
114-
):
123+
sid_server: Union[str, int],
124+
id_info_params: Dict,
125+
partner_params: Dict,
126+
use_validation_api=False,
127+
) -> None:
115128
job_type = partner_params.get("job_type")
116129
if job_type != 6 and not id_info_params.get("entered"):
117130
return
@@ -161,11 +174,11 @@ def validate_id_params(
161174
raise ValueError(f"key {key} cannot be empty")
162175

163176
@staticmethod
164-
def get_smile_id_services(sid_server):
165-
if sid_server in [0, 1]:
166-
url = sid_server_map[sid_server]
177+
def get_smile_id_services(sid_server: Union[str, int]) -> Response:
178+
if sid_server in [0, 1, "0", "1"]:
179+
url = sid_server_map[int(sid_server)]
167180
else:
168-
url = sid_server
181+
url = str(sid_server)
169182
response = Utilities.execute_get(f"{url}/services")
170183
if response.status_code != 200:
171184
raise ServerError(
@@ -174,7 +187,7 @@ def get_smile_id_services(sid_server):
174187
return response
175188

176189
@staticmethod
177-
def execute_get(url):
190+
def execute_get(url: str) -> Response:
178191
resp = requests.get(
179192
url=url,
180193
headers={
@@ -185,7 +198,7 @@ def execute_get(url):
185198
return resp
186199

187200
@staticmethod
188-
def execute_post(url, payload):
201+
def execute_post(url: str, payload: Dict) -> Response:
189202
data = json.dumps(payload)
190203
resp = requests.post(
191204
url=url,
@@ -199,14 +212,14 @@ def execute_post(url, payload):
199212
return resp
200213

201214

202-
def validate_sec_params(sec_key_dict: Dict):
215+
def validate_sec_params(sec_key_dict: Dict) -> None:
203216
if not sec_key_dict.get("sec_key") and not sec_key_dict.get("signature"):
204217
raise Exception("Missing key, must provide a 'sec_key' or 'signature' field")
205218
if not sec_key_dict.get("timestamp"):
206219
raise Exception("Missing 'timestamp' field")
207220

208221

209-
def get_signature(partner_id, api_key, is_signature):
222+
def get_signature(partner_id: str, api_key: str, is_signature) -> Dict[str, str]:
210223
sec_key_gen = Signature(partner_id, api_key)
211224
sec_key_object = (
212225
sec_key_gen.generate_signature()

0 commit comments

Comments
 (0)