[docs]defauth_headers(cls,json=True,api_key:Optional[str]=None)->Dict[str,str]:# An explicitly provided api_key takes priority over the global one.key=api_keyorparseur.api_keyifnotkey:raiseValueError("API token is required. Run 'parseur init' first.")headers={"Authorization":f"Token {key}"}ifjson:headers["Content-Type"]="application/json"returnheaders
@classmethod
[docs]defrequest(cls,method:str,endpoint:str,*,api_key:Optional[str]=None,**kwargs)->Any:url=urljoin(parseur.api_base,endpoint)logging.debug(f"Request: {method}{url}")headers=cls.auth_headers(json="json"inkwargs,api_key=api_key)response=requests.request(method,url,headers=headers,**kwargs)response.raise_for_status()# Some endpoints (e.g. DELETE /webhook) reply with an empty body.ifresponse.status_code==204ornotresponse.content:returnNonereturnresponse.json()
@classmethod
[docs]defdownload(cls,url:str,*,api_key:Optional[str]=None)->bytes:"""GET a (possibly relative) URL with auth and return the raw bytes."""full_url=urlifurl.startswith("http")elseurljoin(parseur.api_base,url)headers=cls.auth_headers(json=False,api_key=api_key)response=requests.get(full_url,headers=headers)response.raise_for_status()returnresponse.content