pymonzo base API resource related code.
BaseResource
dataclass
Base Monzo API resource class.
Attributes:
| Name |
Type |
Description |
client |
MonzoAPI
|
Monzo API client instance.
|
Source code in pymonzo/resources.py
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 | @dataclass
class BaseResource:
"""Base Monzo API resource class.
Attributes:
client: Monzo API client instance.
"""
client: "MonzoAPI"
def _get_response(
self,
method: str,
endpoint: str,
params: Optional[dict] = None,
data: Optional[dict] = None,
) -> httpx.Response:
"""Handle HTTP requests and catch API errors.
Arguments:
method: HTTP method.
endpoint: HTTP endpoint.
params: URL query parameters.
data: form encoded data.
Returns:
HTTP response.
Raises:
MonzoAccessDenied: When access to Monzo API was denied.
MonzoAPIError: When Monzo API returned an error.
"""
httpx_kwargs = {"params": params}
if method in ["post", "put", "patch"]:
httpx_kwargs["data"] = data
response = getattr(self.client.session, method)(endpoint, **httpx_kwargs)
if response.status_code == codes.FORBIDDEN:
raise MonzoAccessDenied(
"Monzo API access denied (HTTP 403 Forbidden). "
"Make sure to (re)authenticate the OAuth app on your mobile device."
)
try:
response.raise_for_status()
except httpx.HTTPStatusError as e:
try:
content = response.json()
except json.decoder.JSONDecodeError:
content = {}
error = content.get("message")
code = content.get("code")
if error and code:
msg = f"{error} ({code})"
else:
msg = f"Something went wrong: {e}"
raise MonzoAPIError(msg) from e
return response
|