Moved to uv and aiohttp
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import requests
|
||||
import aiohttp
|
||||
from datetime import datetime, timedelta
|
||||
from loguru import logger
|
||||
|
||||
@@ -20,7 +20,6 @@ class HttpClientException(ClientException):
|
||||
return "["+str(self.http_code)+"] - " + self.message
|
||||
|
||||
|
||||
|
||||
class Client():
|
||||
def __init__(self, username, api_key) -> None:
|
||||
self.host = "https://api.rapt.io"
|
||||
@@ -30,36 +29,40 @@ class Client():
|
||||
self.expires_seconds = None
|
||||
self.expires = None
|
||||
|
||||
def get_jwt_token(self):
|
||||
url = "https://id.rapt.io/connect/token"
|
||||
response = requests.post(url, data={
|
||||
"client_id": "rapt-user",
|
||||
"grant_type": "password",
|
||||
"username": self.username,
|
||||
"password": self.api_key
|
||||
})
|
||||
|
||||
if response.status_code == 200:
|
||||
response_json = response.json()
|
||||
self.token = response_json["access_token"]
|
||||
self.expires_seconds = response_json["expires_in"]
|
||||
self.expires = datetime.now() + timedelta(seconds=self.expires_seconds)
|
||||
logger.trace("Expires: " + str(self.expires))
|
||||
else:
|
||||
raise HttpClientException(response.reason, response.status_code)
|
||||
async def get_jwt_token(self):
|
||||
async with aiohttp.ClientSession() as session:
|
||||
url = "https://id.rapt.io/connect/token"
|
||||
async with session.post(url, data={
|
||||
"client_id": "rapt-user",
|
||||
"grant_type": "password",
|
||||
"username": self.username,
|
||||
"password": self.api_key
|
||||
}) as response:
|
||||
|
||||
def get_auth_headers(self):
|
||||
response_json = await response.json()
|
||||
if response.status == 200:
|
||||
self.token = response_json["access_token"]
|
||||
self.expires_seconds = response_json["expires_in"]
|
||||
self.expires = datetime.now() + timedelta(seconds=self.expires_seconds)
|
||||
logger.trace("Expires: " + str(self.expires))
|
||||
else:
|
||||
raise HttpClientException(response.reason, response.status)
|
||||
|
||||
async def get_auth_headers(self):
|
||||
#TODO: Check expiry
|
||||
if self.expires is None or self.expires <= datetime.now():
|
||||
self.get_jwt_token()
|
||||
await self.get_jwt_token()
|
||||
|
||||
return {"Authorization": "Bearer {}".format(self.token)}
|
||||
|
||||
def get_json(self, url, parameters):
|
||||
headers = self.get_auth_headers()
|
||||
response = requests.get(self.host+url, headers=headers, params=parameters)
|
||||
logger.trace(response.request.url)
|
||||
if response.status_code == 200:
|
||||
return response.json()
|
||||
else:
|
||||
raise HttpClientException(response.reason, response.status_code)
|
||||
async def get_json(self, url, parameters):
|
||||
headers = await self.get_auth_headers()
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(url, headers=headers, params=parameters) as response:
|
||||
|
||||
response_json = await response.json()
|
||||
logger.trace(response.request_info.url)
|
||||
if response.status == 200:
|
||||
return response_json
|
||||
else:
|
||||
raise HttpClientException(response.reason, response.status)
|
||||
|
||||
@@ -9,10 +9,10 @@ class FermentationChamber():
|
||||
def __init__(self, client) -> None:
|
||||
self.client = client
|
||||
|
||||
def get_fermentation_chambers(self) -> Optional[List[FermentationChamberModel]]:
|
||||
async def get_fermentation_chambers(self) -> Optional[List[FermentationChamberModel]]:
|
||||
logger.debug("## GET FERMENTATION CHAMBERS ##")
|
||||
try:
|
||||
response_json = self.client.get_json("/api/fermentationchambers/getfermentationchambers", None)
|
||||
response_json = await self.client.get_json("/api/fermentationchambers/getfermentationchambers", None)
|
||||
logger.trace(response_json)
|
||||
fermentation_chambers_adapter = TypeAdapter(list[FermentationChamberModel])
|
||||
return fermentation_chambers_adapter.validate_python(response_json)
|
||||
@@ -20,13 +20,13 @@ class FermentationChamber():
|
||||
#TODO: Handle Exception gracefully
|
||||
return None
|
||||
|
||||
def get_fermentation_chamber(self, fermentation_chamber_id) -> Optional[FermentationChamberModel]:
|
||||
async def get_fermentation_chamber(self, fermentation_chamber_id) -> Optional[FermentationChamberModel]:
|
||||
logger.debug("## GET FERMENTATION CHAMBER ##")
|
||||
params = {
|
||||
"fermentationChamberId": fermentation_chamber_id
|
||||
}
|
||||
try:
|
||||
response_json = self.client.get_json("/api/fermentationchambers/getfermentationchamber", params)
|
||||
response_json = await self.client.get_json("/api/fermentationchambers/getfermentationchamber", params)
|
||||
logger.trace(response_json)
|
||||
return FermentationChamberModel.model_validate(response_json)
|
||||
except ClientException:
|
||||
@@ -34,7 +34,7 @@ class FermentationChamber():
|
||||
return None
|
||||
|
||||
|
||||
def get_telemetry(self, fermentation_chamber_id, start_date, end_date, profile_session_id) -> Optional[List[FermentationChamberTelemetryModel]]:
|
||||
async def get_telemetry(self, fermentation_chamber_id, start_date, end_date, profile_session_id) -> Optional[List[FermentationChamberTelemetryModel]]:
|
||||
logger.debug("## GET TELEMETRY ##")
|
||||
params = {
|
||||
"fermentationChamberId": fermentation_chamber_id,
|
||||
@@ -43,7 +43,7 @@ class FermentationChamber():
|
||||
"profileSessionId": profile_session_id
|
||||
}
|
||||
try:
|
||||
response_json = self.client.get_json("/api/fermentationchambers/gettelemetry", params)
|
||||
response_json = await self.client.get_json("/api/fermentationchambers/gettelemetry", params)
|
||||
logger.trace(response_json)
|
||||
fermentation_chambers_adapter = TypeAdapter(list[FermentationChamberTelemetryModel])
|
||||
return fermentation_chambers_adapter.validate_python(response_json)
|
||||
|
||||
@@ -9,10 +9,10 @@ class Hydrometer():
|
||||
def __init__(self, client) -> None:
|
||||
self.client = client
|
||||
|
||||
def get_hydrometers(self) -> Optional[List[HydrometerModel]]:
|
||||
async def get_hydrometers(self) -> Optional[List[HydrometerModel]]:
|
||||
logger.debug("## GET HYDROMETERS ##")
|
||||
try:
|
||||
response_json = self.client.get_json("/api/hydrometers/gethydrometers", None)
|
||||
response_json = await self.client.get_json("/api/hydrometers/gethydrometers", None)
|
||||
logger.trace(response_json)
|
||||
hydrometers_adapter = TypeAdapter(list[HydrometerModel])
|
||||
return hydrometers_adapter.validate_python(response_json)
|
||||
@@ -20,13 +20,13 @@ class Hydrometer():
|
||||
#TODO: Handle Exception gracefully
|
||||
return None
|
||||
|
||||
def get_hydrometer(self, hydrometer_id) -> Optional[HydrometerModel]:
|
||||
async def get_hydrometer(self, hydrometer_id) -> Optional[HydrometerModel]:
|
||||
logger.debug("## GET HYDROMETER ##")
|
||||
params = {
|
||||
"hydrometerId": hydrometer_id
|
||||
}
|
||||
try:
|
||||
response_json = self.client.get_json("/api/hydrometers/gethydrometer", params)
|
||||
response_json = await self.client.get_json("/api/hydrometers/gethydrometer", params)
|
||||
logger.trace(response_json)
|
||||
return HydrometerModel.model_validate(response_json)
|
||||
except ClientException:
|
||||
@@ -34,7 +34,7 @@ class Hydrometer():
|
||||
return None
|
||||
|
||||
|
||||
def get_telemetry(self, hydrometer_id, start_date, end_date, profile_session_id) -> Optional[List[HydrometerTelemetryModel]]:
|
||||
async def get_telemetry(self, hydrometer_id, start_date, end_date, profile_session_id) -> Optional[List[HydrometerTelemetryModel]]:
|
||||
logger.debug("## GET TELEMETRY ##")
|
||||
params = {
|
||||
"hydrometerId": hydrometer_id,
|
||||
@@ -43,7 +43,7 @@ class Hydrometer():
|
||||
"profileSessionId": profile_session_id
|
||||
}
|
||||
try:
|
||||
response_json = self.client.get_json("/api/hydrometers/gettelemetry", params)
|
||||
response_json = await self.client.get_json("/api/hydrometers/gettelemetry", params)
|
||||
logger.trace(response_json)
|
||||
hydrometers_adapter = TypeAdapter(list[HydrometerTelemetryModel])
|
||||
return hydrometers_adapter.validate_python(response_json)
|
||||
|
||||
Reference in New Issue
Block a user