split off requests and env handling

This commit is contained in:
AcerecA 2026-01-02 16:30:29 +01:00
parent da494835cb
commit 0407393eda
3 changed files with 63 additions and 49 deletions

View File

@ -4,42 +4,9 @@ from json import loads
from os import environ from os import environ
from typing import Any, Callable, Self, TypedDict from typing import Any, Callable, Self, TypedDict
from urllib.request import Request, urlopen
from .hints import JSONDataMap from .hints import JSONDataMap
from .requests import get, put
from .env import EnvVar
def get(
url: str,
query_params: dict[str, str] | None = None,
headers: dict[str, str] | None = None,
) -> str:
with urlopen(
Request(
url + ("?" + "&".join(f"{k}={v}" for k, v in query_params.items()))
if query_params
else "",
headers=headers or {},
method="GET",
),
) as resp:
return resp.read().decode("utf-8")
def put(
url: str,
data: dict[str, str] | None = None,
headers: dict[str, str] | None = None,
) -> str:
with urlopen(
Request(
url,
str(data).encode(),
headers=headers or {},
method="PUT",
),
) as resp:
return resp.read().decode("utf-8")
class TaskRespDict(TypedDict): class TaskRespDict(TypedDict):
@ -134,33 +101,22 @@ class ClickupTask:
return ret return ret
def get_env_var(var_name: str, err_msg: str = "") -> Callable[[], str]:
def wrapper(var: str = var_name) -> str:
try:
return environ[var]
except KeyError as e:
e.add_note(err_msg)
raise
return wrapper
@dataclass @dataclass
class ClickupSession: class ClickupSession:
auth_key: str = field( auth_key: str = field(
default_factory=get_env_var( default_factory=EnvVar(
"CLICKUP_AUTH", "CLICKUP_AUTH",
"clickup auth token is required to be set", "clickup auth token is required to be set",
) )
) )
workspace_id: str = field( workspace_id: str = field(
default_factory=get_env_var( default_factory=EnvVar(
"CLICKUP_WORKSPACE_ID", "CLICKUP_WORKSPACE_ID",
"clickup workspace id is required to be set", "clickup workspace id is required to be set",
) )
) )
user_id: str = field( user_id: str = field(
default_factory=get_env_var( default_factory=EnvVar(
"CLICKUP_USER_ID", "CLICKUP_USER_ID",
"clickup user id is required to be set", "clickup user id is required to be set",
) )

View File

@ -0,0 +1,24 @@
from dataclasses import dataclass
from os import environ
@dataclass
class EnvVar:
"""
Environment Variable fetcher for use in dataclass ``field(default_factory=...)``
>>> @dataclass
>>> class SomeDataclass:
... field_name: str = field(default_factory=EnvVar("SOME_VAR_NAME", "err msg"))
"""
var_name: str
err_msg: str = ""
def __call__(self) -> str:
try:
return environ[self.var_name]
except KeyError as e:
e.add_note(self.err_msg)
raise

View File

@ -0,0 +1,34 @@
from urllib.request import Request, urlopen
def get(
url: str,
query_params: dict[str, str] | None = None,
headers: dict[str, str] | None = None,
) -> str:
with urlopen(
Request(
url + ("?" + "&".join(f"{k}={v}" for k, v in query_params.items()))
if query_params
else "",
headers=headers or {},
method="GET",
),
) as resp:
return resp.read().decode("utf-8")
def put(
url: str,
data: dict[str, str] | None = None,
headers: dict[str, str] | None = None,
) -> str:
with urlopen(
Request(
url,
str(data).encode(),
headers=headers or {},
method="PUT",
),
) as resp:
return resp.read().decode("utf-8")