|
88 | 88 | " params += [_mk_param(k, **_mk_sig_detls(v)) for k,v in anno_args.items()]\n", |
89 | 89 | " return Signature(params)\n", |
90 | 90 | "\n", |
| 91 | + "def _decode_response(path: str) -> bool:\n", |
| 92 | + " \"checks if a endpoint needs to have it's response from `fastcore.core.urlsend` decoded or just return json\"\n", |
| 93 | + " needs_decode = (\n", |
| 94 | + " \"/orgs/{org}/migrations/{migration_id}/archive\",\n", |
| 95 | + " \"/repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}\",\n", |
| 96 | + " \"/repos/{owner}/{repo}/tarball/{ref}\",\n", |
| 97 | + " \"/repos/{owner}/{repo}/zipball/{ref}\",\n", |
| 98 | + " )\n", |
| 99 | + " return path not in needs_decode\n", |
| 100 | + "\n", |
91 | 101 | "class _GhObj: pass" |
92 | 102 | ] |
93 | 103 | }, |
|
99 | 109 | "source": [ |
100 | 110 | "#|export\n", |
101 | 111 | "class _GhVerb(_GhObj):\n", |
102 | | - " __slots__ = 'path,verb,tag,name,summary,url,route_ps,params,data,preview,client,__doc__'.split(',')\n", |
| 112 | + " __slots__ = 'path,verb,tag,name,summary,url,route_ps,params,data,preview,client,decode,__doc__'.split(',')\n", |
103 | 113 | " def __init__(self, path, verb, oper, summary, url, params, data, preview, client, kwargs):\n", |
104 | 114 | " tag,*name = oper.split('/')\n", |
105 | 115 | " name = '__'.join(name)\n", |
106 | 116 | " name = name.replace('-','_')\n", |
| 117 | + " decode = _decode_response(path)\n", |
107 | 118 | " path,_,_ = partial_format(path, **kwargs)\n", |
108 | 119 | " route_ps = stringfmt_names(path)\n", |
109 | 120 | " __doc__ = summary\n", |
|
117 | 128 | " for a,b in zip(args,flds): kwargs[b]=a\n", |
118 | 129 | " route_p,query_p,data_p = [{p:kwargs[p] for p in o if p in kwargs}\n", |
119 | 130 | " for o in (self.route_ps,self.params,d)]\n", |
120 | | - " return self.client(self.path, self.verb, headers=headers, route=route_p, query=query_p, data=data_p)\n", |
| 131 | + " return self.client(self.path, self.verb, headers=headers, decode=self.decode, route=route_p, query=query_p, data=data_p)\n", |
121 | 132 | "\n", |
122 | 133 | " def __str__(self): return f'{self.tag}.{self.name}{signature(self)}\\n{self.doc_url}'\n", |
123 | 134 | " @property\n", |
|
201 | 212 | " self.debug,self.limit_cb,self.limit_rem = debug,limit_cb,5000\n", |
202 | 213 | " self.gh_host = gh_host or GH_HOST\n", |
203 | 214 | "\n", |
204 | | - " def __call__(self, path:str, verb:str=None, headers:dict=None, route:dict=None, query:dict=None, data=None, timeout=None):\n", |
| 215 | + " def __call__(self, path:str, verb:str=None, headers:dict=None, route:dict=None, query:dict=None, data=None, timeout=None, decode=True):\n", |
205 | 216 | " \"Call a fully specified `path` using HTTP `verb`, passing arguments to `fastcore.core.urlsend`\"\n", |
206 | 217 | " if verb is None: verb = 'POST' if data else 'GET'\n", |
207 | 218 | " headers = {**self.headers,**(headers or {})}\n", |
208 | 219 | " if not path.startswith(('http://', 'https://')):\n", |
209 | 220 | " path = self.gh_host + path\n", |
210 | 221 | " if route:\n", |
211 | 222 | " for k,v in route.items(): route[k] = quote(str(route[k]))\n", |
212 | | - " return_json = ('json' in headers['Accept'])\n", |
| 223 | + " return_json = ('json' in headers['Accept']) and (decode is True)\n", |
213 | 224 | " debug = self.debug if self.debug else print_summary if os.getenv('GHAPI_DEBUG') else None\n", |
214 | | - " res,self.recv_hdrs = urlsend(path, verb, headers=headers or None, debug=debug, return_headers=True,\n", |
| 225 | + " res,self.recv_hdrs = urlsend(path, verb, headers=headers or None, decode=decode, debug=debug, return_headers=True,\n", |
215 | 226 | " route=route or None, query=query or None, data=data or None, return_json=return_json, timeout=timeout)\n", |
216 | 227 | " if 'X-RateLimit-Remaining' in self.recv_hdrs:\n", |
217 | 228 | " newlim = self.recv_hdrs['X-RateLimit-Remaining']\n", |
|
0 commit comments