[docs]@dataclasses.dataclassclassBaseModel:def_validate(self):forfieldindataclasses.fields(self.__class__):iffield.init:k=field.nameifgetattr(self,k)isREQ:# pragma: no coverraiseParamError(f"Field {k!r} is required for {self.__class__}.")def__post_init__(self):self._validate()@classmethoddef_split_req_opt(cls,kwargs:T_KWARGS)->T.Tuple[T_KWARGS,T_KWARGS]:req_kwargs,opt_kwargs=dict(),dict()forfieldindataclasses.fields(cls):ifisinstance(field.default,_REQUIRED):try:req_kwargs[field.name]=kwargs[field.name]exceptKeyError:raiseParamError(f"{field.name!r} is a required parameter for {cls}!")else:try:opt_kwargs[field.name]=kwargs[field.name]exceptKeyError:passopt_kwargs=rm_na(**opt_kwargs)returnreq_kwargs,opt_kwargs
def_get_site_url(url:str)->str:""" Convert any of these url to https://mycompany.atlassian.net - https://mycompany.atlassian.net/wiki/spaces/SPACEKEY/... - https://mycompany.atlassian.net/jira/core/projects/PROJECTKEY/board/... """parts=url.split("/")return"/".join(parts[:3])
[docs]defrequest(self,method:str,# GET, POST, PUT, DELETEurl:str,params:T.Optional[T_KWARGS]=None,req_kwargs:T.Optional[T_KWARGS]=None,)->"requests.Response":""" Make HTTP request and get response. :param req_kwargs: additional ``requests.request()`` kwargs """kwargs=dict(method=method,url=url,headers=self.headers,params=params,auth=self.http_basic_auth,)ifreq_kwargsisnotNone:kwargs.update(req_kwargs)returnrequests.request(**kwargs)
[docs]defmake_request(self,method:str,url:str,params:T.Optional[T.Dict[str,T.Any]]=None,req_kwargs:T.Optional[T_KWARGS]=None,)->T_RESPONSE:""" Wrap the response object with better error handling. :param req_kwargs: additional ``requests.request()`` kwargs """# print(f"{method = }") # for debug only# print(f"{url = }") # for debug only# print(f"{params = }") # for debug onlyres=self.request(method=method,url=url,params=params,req_kwargs=req_kwargs,)res.raise_for_status()returnjson.loads(res.text)