Skip to content

resources

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