1
1
import logging
2
- from typing import TYPE_CHECKING , Any , Dict , List , Optional
2
+ from typing import TYPE_CHECKING , Any , Dict , List , Optional , cast
3
3
from urllib .parse import urljoin
4
4
5
5
import requests
6
- from funcy import compact
6
+ from funcy import compact , ignore
7
7
from requests .adapters import HTTPAdapter
8
8
9
9
if TYPE_CHECKING :
@@ -29,9 +29,9 @@ def post(
29
29
logger .trace ("Sending %s to %s" , data , endpoint ) # type: ignore[attr-defined]
30
30
31
31
headers = {"Authorization" : f"token { token } " }
32
- resp = session .post (endpoint , json = data , headers = headers , timeout = timeout )
33
- resp .raise_for_status ()
34
- return resp
32
+ r = session .post (endpoint , json = data , headers = headers , timeout = timeout )
33
+ r .raise_for_status ()
34
+ return r
35
35
36
36
37
37
def notify_refs (
@@ -40,13 +40,13 @@ def notify_refs(
40
40
* ,
41
41
studio_url : Optional [str ] = STUDIO_URL ,
42
42
** refs : List [str ],
43
- ) -> None :
43
+ ) -> Dict [ str , Any ] :
44
44
extra_keys = refs .keys () - {"pushed" , "removed" }
45
45
assert not extra_keys , f"got extra args: { extra_keys } "
46
46
47
47
refs = compact (refs )
48
48
if not refs :
49
- return
49
+ return {}
50
50
51
51
logger .debug (
52
52
"notifying Studio%s about updated experiments" ,
@@ -55,22 +55,26 @@ def notify_refs(
55
55
data = {"repo_url" : repo_url , "client" : "dvc" , "refs" : refs }
56
56
57
57
try :
58
- post ("/webhook/dvc" , token , data , url = studio_url )
58
+ r = post ("/webhook/dvc" , token , data , url = studio_url )
59
59
except requests .RequestException as e :
60
60
logger .debug ("" , exc_info = True )
61
61
62
62
msg = str (e )
63
- if (r := e .response ) is not None :
64
- status = r .status_code
65
- # try to parse json response for more detailed error message
66
- try :
67
- d = r .json ()
68
- logger .trace ( # type: ignore[attr-defined]
69
- "received response: %s (status=%r)" , d , status
70
- )
71
- except requests .JSONDecodeError :
72
- pass
73
- else :
74
- if detail := d .get ("detail" ):
75
- msg = f"{ detail } ({ status = } )"
63
+ if e .response is None :
64
+ logger .warning ("failed to notify Studio: %s" , msg .lower ())
65
+ return {}
66
+
67
+ r = cast ("Response" , e .response )
68
+ d = ignore (Exception , default = {})(r .json )()
69
+ status = r .status_code
70
+ if detail := d .get ("detail" ):
71
+ msg = f"{ detail } ({ status = } )"
76
72
logger .warning ("failed to notify Studio: %s" , msg .lower ())
73
+ else :
74
+ d = r .json ()
75
+
76
+ if d :
77
+ logger .trace ( # type: ignore[attr-defined]
78
+ "received response: %s (status=%r)" , d , r .status_code
79
+ )
80
+ return d
0 commit comments