This commit is contained in:
Andrew Herrington
2021-12-10 22:43:32 -06:00
parent 7c3f263b5a
commit dffb9be1bf
6 changed files with 90 additions and 79 deletions

View File

@@ -12,10 +12,14 @@ from urllib.parse import urljoin
from urllib.parse import urlparse
from weakref import finalize
from httpx import Client, Response
from httpx import Client
from httpx import Response
from .exceptions import BadAPIRequestError
from .exceptions import CheckNotFoundError
from .exceptions import HCAPIAuthError
from .exceptions import HCAPIError
from healthchecks_io.schemas import checks
from .exceptions import HCAPIAuthError, HCAPIError, CheckNotFoundError, BadAPIRequestError
class AbstractClient(ABC):
@@ -91,6 +95,7 @@ class AbstractClient(ABC):
HCAPIAuthError: Raised when status_code == 401 or 403
HCAPIError: Raised when status_code is 5xx
CheckNotFoundError: Raised when status_code is 404
BadAPIRequestError: Raised when status_code is 400
Returns:
Response: the passed in response object
@@ -103,12 +108,14 @@ class AbstractClient(ABC):
f"Error when reaching out to HC API at {response.request.url}. "
f"Status Code {response.status_code}. Response {response.text}"
)
if response.status_code == 404:
raise CheckNotFoundError(f"CHeck not found at {response.request.url}")
if response.status_code == 400:
raise BadAPIRequestError(f"Bad request when requesting {response.request.url}. {response.text}")
raise BadAPIRequestError(
f"Bad request when requesting {response.request.url}. {response.text}"
)
return response

View File

@@ -73,9 +73,9 @@ class AsyncClient(AbstractClient):
checks.Check.from_api_result(check_data)
for check_data in response.json()["checks"]
]
async def get_check(self, check_id: str) -> checks.Check:
"""Get a single check by id.
"""Get a single check by id.
check_id can either be a check uuid if using a read/write api key
or a unique key if using a read only api key.
@@ -97,9 +97,9 @@ class AsyncClient(AbstractClient):
return checks.Check.from_api_result(response.json())
async def pause_check(self, check_id: str) -> checks.Check:
"""Disables monitoring for a check without removing it.
The check goes into a "paused" state.
"""Disables monitoring for a check without removing it.
The check goes into a "paused" state.
You can resume monitoring of the check by pinging it.
check_id must be a uuid, not a unique id
@@ -117,11 +117,11 @@ class AsyncClient(AbstractClient):
"""
request_url = self._get_api_request_url(f"checks/{check_id}/pause")
response = self.check_response(await self._client.post(request_url , data={}))
response = self.check_response(await self._client.post(request_url, data={}))
return checks.Check.from_api_result(response.json())
async def delete_check(self, check_id: str) -> checks.Check:
"""Permanently deletes the check from the user's account.
"""Permanently deletes the check from the user's account.
check_id must be a uuid, not a unique id
@@ -143,9 +143,9 @@ class AsyncClient(AbstractClient):
async def get_check_pings(self, check_id: str) -> List[checks.CheckPings]:
"""Returns a list of pings this check has received.
This endpoint returns pings in reverse order (most recent first),
and the total number of returned pings depends on the account's
This endpoint returns pings in reverse order (most recent first),
and the total number of returned pings depends on the account's
billing plan: 100 for free accounts, 1000 for paid accounts.
Args:
@@ -167,10 +167,15 @@ class AsyncClient(AbstractClient):
for check_data in response.json()["pings"]
]
async def get_check_flips(self, check_id: str, seconds: Optional[int] = None, start: Optional[int] = None, end: Optional[int] = None) -> List[checks.CheckStatuses]:
"""
Returns a list of "flips" this check has experienced.
async def get_check_flips(
self,
check_id: str,
seconds: Optional[int] = None,
start: Optional[int] = None,
end: Optional[int] = None,
) -> List[checks.CheckStatuses]:
"""Returns a list of "flips" this check has experienced.
A flip is a change of status (from "down" to "up," or from "up" to "down").
Raises:
@@ -187,19 +192,16 @@ class AsyncClient(AbstractClient):
Returns:
List[checks.CheckStatuses]: List of status flips for this check
"""
params = dict()
if seconds is not None and seconds >=0:
params['seconds'] = seconds
if seconds is not None and seconds >= 0:
params["seconds"] = seconds
if start is not None and start >= 0:
params['start'] = start
params["start"] = start
if end is not None and end >= 0:
params['end'] = end
params["end"] = end
request_url = self._get_api_request_url(f"checks/{check_id}/flips/", params)
response = self.check_response(await self._client.get(request_url))
return [
checks.CheckStatuses(**status_data)
for status_data in response.json()
]
return [checks.CheckStatuses(**status_data) for status_data in response.json()]

View File

@@ -12,12 +12,14 @@ class HCAPIAuthError(HCAPIError):
...
class CheckNotFoundError(HCAPIError):
"""Thrown when getting a check returns a 404."""
...
class BadAPIRequestError(HCAPIError):
"""Thrown when an api request returns a 400."""
...
...