Skip to content

Commit acc4ae5

Browse files
committed
add minimal docs
1 parent 3f8d2fa commit acc4ae5

File tree

2 files changed

+46
-28
lines changed

2 files changed

+46
-28
lines changed

fastcore/net.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -110,26 +110,26 @@ def urlopen(url, data=None, headers=None, timeout=None, **kwargs):
110110
raise e
111111
except Exception as e: raise e
112112

113-
# %% ../nbs/03b_net.ipynb 18
113+
# %% ../nbs/03b_net.ipynb 20
114114
def urlread(url, data=None, headers=None, decode=True, return_json=False, return_headers=False, timeout=None, **kwargs):
115115
"Retrieve `url`, using `data` dict or `kwargs` to `POST` if present"
116116
try:
117117
with urlopen(url, data=data, headers=headers, timeout=timeout, **kwargs) as u: res,hdrs = u.read(),u.headers
118118
except HTTPError as e:
119-
if 400 <= e.code < 500: raise ExceptionsHTTP[e.code](e.url, e.hdrs, e.fp) from None
119+
if 400 <= e.code < 500: raise ExceptionsHTTP[e.code](e.url, e.hdrs, e.fp, msg=e.msg) from None
120120
else: raise
121121

122122
if decode: res = res.decode()
123123
if return_json: res = loads(res)
124124
return (res,dict(hdrs)) if return_headers else res
125125

126-
# %% ../nbs/03b_net.ipynb 20
126+
# %% ../nbs/03b_net.ipynb 21
127127
def urljson(url, data=None, timeout=None):
128128
"Retrieve `url` and decode json"
129129
res = urlread(url, data=data, timeout=timeout)
130130
return json.loads(res) if res else {}
131131

132-
# %% ../nbs/03b_net.ipynb 22
132+
# %% ../nbs/03b_net.ipynb 23
133133
def urlcheck(url, timeout=10):
134134
if not url: return True
135135
try:
@@ -138,12 +138,12 @@ def urlcheck(url, timeout=10):
138138
except socket.timeout: return False
139139
except InvalidURL: return False
140140

141-
# %% ../nbs/03b_net.ipynb 23
141+
# %% ../nbs/03b_net.ipynb 24
142142
def urlclean(url):
143143
"Remove fragment, params, and querystring from `url` if present"
144144
return urlunparse(urlparse(str(url))[:3]+('','',''))
145145

146-
# %% ../nbs/03b_net.ipynb 25
146+
# %% ../nbs/03b_net.ipynb 26
147147
def urlretrieve(url, filename=None, reporthook=None, data=None, timeout=None):
148148
"Same as `urllib.request.urlretrieve` but also works with `Request` objects"
149149
with contextlib.closing(urlopen(url, data, timeout=timeout)) as fp:
@@ -169,43 +169,43 @@ def urlretrieve(url, filename=None, reporthook=None, data=None, timeout=None):
169169
raise ContentTooShortError(f"retrieval incomplete: got only {read} out of {size} bytes", headers)
170170
return filename,headers
171171

172-
# %% ../nbs/03b_net.ipynb 26
172+
# %% ../nbs/03b_net.ipynb 27
173173
def urldest(url, dest=None):
174174
name = urlclean(Path(url).name)
175175
if dest is None: dest = name
176176
dest = Path(dest)
177177
return dest/name if dest.is_dir() else dest
178178

179-
# %% ../nbs/03b_net.ipynb 27
179+
# %% ../nbs/03b_net.ipynb 28
180180
def urlsave(url, dest=None, reporthook=None, timeout=None):
181181
"Retrieve `url` and save based on its name"
182182
dest = urldest(url, dest)
183183
dest.parent.mkdir(parents=True, exist_ok=True)
184184
nm,msg = urlretrieve(url, dest, reporthook, timeout=timeout)
185185
return nm
186186

187-
# %% ../nbs/03b_net.ipynb 29
187+
# %% ../nbs/03b_net.ipynb 30
188188
def urlvalid(x):
189189
"Test if `x` is a valid URL"
190190
return all (getattrs(urlparse(str(x)), 'scheme', 'netloc'))
191191

192-
# %% ../nbs/03b_net.ipynb 31
192+
# %% ../nbs/03b_net.ipynb 32
193193
def urlrequest(url, verb, headers=None, route=None, query=None, data=None, json_data=True):
194194
"`Request` for `url` with optional route params replaced by `route`, plus `query` string, and post `data`"
195195
if route: url = url.format(**route)
196196
if query: url += '?' + urlencode(query)
197197
if isinstance(data,dict): data = (json.dumps if json_data else urlencode)(data).encode('ascii')
198198
return Request(url, headers=headers or {}, data=data or None, method=verb.upper())
199199

200-
# %% ../nbs/03b_net.ipynb 34
200+
# %% ../nbs/03b_net.ipynb 35
201201
@patch
202202
def summary(self:Request, skip=None)->dict:
203203
"Summary containing full_url, headers, method, and data, removing `skip` from headers"
204204
res = L('full_url','method','data').map_dict(partial(getattr,self))
205205
res['headers'] = {k:v for k,v in self.headers.items() if k not in listify(skip)}
206206
return res
207207

208-
# %% ../nbs/03b_net.ipynb 36
208+
# %% ../nbs/03b_net.ipynb 37
209209
def urlsend(url, verb, headers=None, route=None, query=None, data=None, json_data=True,
210210
return_json=True, return_headers=False, debug=None):
211211
"Send request with `urlrequest`, converting result to json if `return_json`"
@@ -217,7 +217,7 @@ def urlsend(url, verb, headers=None, route=None, query=None, data=None, json_dat
217217

218218
return urlread(req, return_json=return_json, return_headers=return_headers)
219219

220-
# %% ../nbs/03b_net.ipynb 37
220+
# %% ../nbs/03b_net.ipynb 38
221221
def do_request(url, post=False, headers=None, **data):
222222
"Call GET or json-encoded POST on `url`, depending on `post`"
223223
if data:
@@ -227,13 +227,13 @@ def do_request(url, post=False, headers=None, **data):
227227
data = None
228228
return urljson(Request(url, headers=headers, data=data or None))
229229

230-
# %% ../nbs/03b_net.ipynb 38
230+
# %% ../nbs/03b_net.ipynb 39
231231
def _socket_det(port,host,dgram):
232232
if isinstance(port,int): family,addr = socket.AF_INET,(host or socket.gethostname(),port)
233233
else: family,addr = socket.AF_UNIX,port
234234
return family,addr,(socket.SOCK_STREAM,socket.SOCK_DGRAM)[dgram]
235235

236-
# %% ../nbs/03b_net.ipynb 39
236+
# %% ../nbs/03b_net.ipynb 40
237237
def start_server(port, host=None, dgram=False, reuse_addr=True, n_queue=None):
238238
"Create a `socket` server on `port`, with optional `host`, of type `dgram`"
239239
listen_args = [n_queue] if n_queue else []
@@ -247,7 +247,7 @@ def start_server(port, host=None, dgram=False, reuse_addr=True, n_queue=None):
247247
s.listen(*listen_args)
248248
return s
249249

250-
# %% ../nbs/03b_net.ipynb 41
250+
# %% ../nbs/03b_net.ipynb 42
251251
def start_client(port, host=None, dgram=False):
252252
"Create a `socket` client on `port`, with optional `host`, of type `dgram`"
253253
family,addr,typ = _socket_det(port,host,dgram)

nbs/03b_net.ipynb

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,35 @@
320320
" except Exception as e: raise e"
321321
]
322322
},
323+
{
324+
"cell_type": "markdown",
325+
"metadata": {},
326+
"source": [
327+
"With `urlopen`, the body of the response will also be returned in addition to the message if there is an error:"
328+
]
329+
},
330+
{
331+
"cell_type": "code",
332+
"execution_count": null,
333+
"metadata": {},
334+
"outputs": [
335+
{
336+
"name": "stdout",
337+
"output_type": "stream",
338+
"text": [
339+
"404 Not Found\n",
340+
"====Error Body====\n",
341+
"{'documentation_url': 'https://docs.github.com/rest', 'message': 'Not Found'}\n"
342+
]
343+
}
344+
],
345+
"source": [
346+
"try: urlopen('https://api.github.com/v3')\n",
347+
"except HTTPError as e: \n",
348+
" print(e.code, e.msg)\n",
349+
" assert 'documentation_url' in e.msg"
350+
]
351+
},
323352
{
324353
"cell_type": "code",
325354
"execution_count": null,
@@ -332,25 +361,14 @@
332361
" try:\n",
333362
" with urlopen(url, data=data, headers=headers, timeout=timeout, **kwargs) as u: res,hdrs = u.read(),u.headers\n",
334363
" except HTTPError as e:\n",
335-
" if 400 <= e.code < 500: raise ExceptionsHTTP[e.code](e.url, e.hdrs, e.fp) from None\n",
364+
" if 400 <= e.code < 500: raise ExceptionsHTTP[e.code](e.url, e.hdrs, e.fp, msg=e.msg) from None\n",
336365
" else: raise\n",
337366
"\n",
338367
" if decode: res = res.decode()\n",
339368
" if return_json: res = loads(res)\n",
340369
" return (res,dict(hdrs)) if return_headers else res"
341370
]
342371
},
343-
{
344-
"cell_type": "code",
345-
"execution_count": null,
346-
"metadata": {},
347-
"outputs": [],
348-
"source": [
349-
"# The error should contain the body of the error, too\n",
350-
"try: urlread('https://api.github.com/v3')\n",
351-
"except HTTPError as e: assert 'documentation_url' in e.msg"
352-
]
353-
},
354372
{
355373
"cell_type": "code",
356374
"execution_count": null,

0 commit comments

Comments
 (0)