11import os
22import warnings
3- from typing import List , Optional , Union
3+ from typing import Any , List , Optional , Union
44
55import requests
66
@@ -16,142 +16,156 @@ def __init__(self, api_key: Optional[str] = None):
1616 if self .api_key :
1717 self ._session .headers .update ({"Authorization" : f"Bearer { self .api_key } " })
1818
19- def get (self , url : str , params : Optional [dict ] = None ):
19+ def get (self , url : str , params : Optional [dict ] = None ) -> Any :
2020 """
2121 GET Data
2222 :param url: Request URL. Example `/instances`
2323 :param params: Query Parameters Dictionary
2424 :return: Response Data
25+ :raises: `VultrException`
2526 """
26- return self ._get ( f"{ self .url } /{ url .lstrip ('/' )} " , params )
27+ return self ._req ( "get" , f"{ self .url } /{ url .lstrip ('/' )} " , params )
2728
28- def post (self , url : str , ** kwargs ):
29+ def post (self , url : str , ** kwargs ) -> Any :
2930 """
3031 POST Data
3132 :param url: Request URL. Example `/instances`
3233 :param kwargs: Request Data Keyword Arguments
3334 :return: Response Data
35+ :raises: `VultrException`
3436 """
35- return self ._post ( f"{ self .url } /{ url .lstrip ('/' )} " , kwargs )
37+ return self ._req ( "post" , f"{ self .url } /{ url .lstrip ('/' )} " , kwargs )
3638
37- def patch (self , url : str , ** kwargs ):
39+ def patch (self , url : str , ** kwargs ) -> Any :
3840 """
3941 PATCH Data
40- :param url: Request URL. Example `/instances/{resource_id }`
42+ :param url: Request URL. Example `/instances/{instance-id }`
4143 :param kwargs: Request Data Keyword Arguments
4244 :return: Response Data
45+ :raises: `VultrException`
4346 """
44- return self ._patch ( f"{ self .url } /{ url .lstrip ('/' )} " , kwargs )
47+ return self ._req ( "patch" , f"{ self .url } /{ url .lstrip ('/' )} " , kwargs )
4548
46- def delete (self , url : str ):
49+ def put (self , url : str , ** kwargs ) -> Any :
50+ """
51+ PUT Data
52+ :param url: Request URL. Example `/instances/{instance-id}`
53+ :param kwargs: Request Data Keyword Arguments
54+ :return: Response Data
55+ :raises: `VultrException`
56+ """
57+ return self ._req ("put" , f"{ self .url } /{ url .lstrip ('/' )} " , kwargs )
58+
59+ def delete (self , url : str ) -> None :
4760 """
4861 DELETE a Resource
49- :param url: Request URL. Example `/instances/{resource_id }`
62+ :param url: Request URL. Example `/instances/{instance-id }`
5063 :return: None
64+ :raises: `VultrException`
5165 """
52- return self ._delete ( f"{ self .url } /{ url .lstrip ('/' )} " )
66+ return self ._req ( "delete" , f"{ self .url } /{ url .lstrip ('/' )} " )
5367
54- def list_os (self , params : Optional [dict ] = None ):
68+ def list_os (self , params : Optional [dict ] = None ) -> list :
5569 url = f"{ self .url } /os"
56- return self ._get ( url , params )["os" ]
70+ return self ._req ( "get" , url , params )["os" ]
5771
58- def list_plans (self , params : Optional [dict ] = None ):
72+ def list_plans (self , params : Optional [dict ] = None ) -> list :
5973 url = f"{ self .url } /plans"
60- return self ._get ( url , params )["plans" ]
74+ return self ._req ( "get" , url , params )["plans" ]
6175
62- def list_regions (self , params : Optional [dict ] = None ):
76+ def list_regions (self , params : Optional [dict ] = None ) -> list :
6377 url = f"{ self .url } /regions"
64- return self ._get ( url , params )["regions" ]
78+ return self ._req ( "get" , url , params )["regions" ]
6579
66- def list_instances (self , params : Optional [dict ] = None ):
80+ def list_instances (self , params : Optional [dict ] = None ) -> list :
6781 url = f"{ self .url } /instances"
68- return self ._get ( url , params )["instances" ]
82+ return self ._req ( "get" , url , params )["instances" ]
6983
70- def get_instance (self , instance : Union [str , dict ], params : Optional [dict ] = None ):
84+ def get_instance (self , instance : Union [str , dict ], params : Optional [dict ] = None ) -> dict :
7185 instance_id = self ._get_obj_key (instance )
7286 url = f"{ self .url } /instances/{ instance_id } "
73- return self ._get ( url , params )["instance" ]
87+ return self ._req ( "get" , url , params )["instance" ]
7488
75- def create_instance (self , region : Union [str , dict ], plan : Union [str , dict ], ** kwargs ):
89+ def create_instance (self , region : Union [str , dict ], plan : Union [str , dict ], ** kwargs ) -> dict :
7690 data = {"region" : self ._get_obj_key (region ), "plan" : self ._get_obj_key (plan )}
7791 data .update (kwargs )
7892 url = f"{ self .url } /instances"
79- return self ._post ( url , data )["instance" ]
93+ return self ._req ( "post" , url , data )["instance" ]
8094
81- def update_instance (self , instance : Union [str , dict ], ** kwargs ):
95+ def update_instance (self , instance : Union [str , dict ], ** kwargs ) -> dict :
8296 instance_id = self ._get_obj_key (instance )
8397 url = f"{ self .url } /instances/{ instance_id } "
84- return self ._patch ( url , kwargs )["instance" ]
98+ return self ._req ( "patch" , url , kwargs )["instance" ]
8599
86- def delete_instance (self , instance : Union [str , dict ]):
100+ def delete_instance (self , instance : Union [str , dict ]) -> None :
87101 instance_id = self ._get_obj_key (instance )
88102 url = f"{ self .url } /instances/{ instance_id } "
89- return self ._delete ( url )
103+ return self ._req ( "delete" , url )
90104
91- def list_keys (self , params : Optional [dict ] = None ):
105+ def list_keys (self , params : Optional [dict ] = None ) -> list :
92106 url = f"{ self .url } /ssh-keys"
93- return self ._get ( url , params )["ssh_keys" ]
107+ return self ._req ( "get" , url , params )["ssh_keys" ]
94108
95- def get_key (self , key : Union [str , dict ], params : Optional [dict ] = None ):
109+ def get_key (self , key : Union [str , dict ], params : Optional [dict ] = None ) -> dict :
96110 key_id = self ._get_obj_key (key )
97111 url = f"{ self .url } /ssh-keys/{ key_id } "
98- return self ._get ( url , params )["ssh_key" ]
112+ return self ._req ( "get" , url , params )["ssh_key" ]
99113
100- def create_key (self , name : str , key : str , ** kwargs ):
114+ def create_key (self , name : str , key : str , ** kwargs ) -> dict :
101115 data = {"name" : name , "ssh_key" : key }
102116 data .update (kwargs )
103117 url = f"{ self .url } /ssh-keys"
104- return self ._post ( url , data )["ssh_key" ]
118+ return self ._req ( "post" , url , data )["ssh_key" ]
105119
106- def update_key (self , key : Union [str , dict ], ** kwargs ):
120+ def update_key (self , key : Union [str , dict ], ** kwargs ) -> None :
107121 key_id = self ._get_obj_key (key )
108122 url = f"{ self .url } /ssh-keys/{ key_id } "
109- return self ._patch ( url , kwargs )["ssh_key" ]
123+ return self ._req ( "patch" , url , kwargs )["ssh_key" ]
110124
111- def delete_key (self , key : Union [str , dict ]):
125+ def delete_key (self , key : Union [str , dict ]) -> None :
112126 key_id = self ._get_obj_key (key )
113127 url = f"{ self .url } /ssh-keys/{ key_id } "
114- return self ._delete ( url )
128+ return self ._req ( "delete" , url )
115129
116- def list_scripts (self , params : Optional [dict ] = None ):
130+ def list_scripts (self , params : Optional [dict ] = None ) -> list :
117131 url = f"{ self .url } /startup-scripts"
118- return self ._get ( url , params )["startup_scripts" ]
132+ return self ._req ( "get" , url , params )["startup_scripts" ]
119133
120- def get_script (self , script : Union [str , dict ], params : Optional [dict ] = None ):
134+ def get_script (self , script : Union [str , dict ], params : Optional [dict ] = None ) -> dict :
121135 script_id = self ._get_obj_key (script )
122136 url = f"{ self .url } /startup-scripts/{ script_id } "
123- return self ._get ( url , params )["startup_script" ]
137+ return self ._req ( "get" , url , params )["startup_script" ]
124138
125- def create_script (self , name : str , script : str , ** kwargs ):
139+ def create_script (self , name : str , script : str , ** kwargs ) -> dict :
126140 data = {"name" : name , "script" : script }
127141 data .update (kwargs )
128142 url = f"{ self .url } /startup-scripts"
129- return self ._post ( url , data )["startup_script" ]
143+ return self ._req ( "post" , url , data )["startup_script" ]
130144
131- def update_script (self , script : Union [str , dict ], ** kwargs ):
145+ def update_script (self , script : Union [str , dict ], ** kwargs ) -> None :
132146 script_id = self ._get_obj_key (script )
133147 url = f"{ self .url } /startup-scripts/{ script_id } "
134- return self ._patch ( url , kwargs )["startup_script" ]
148+ return self ._req ( "patch" , url , kwargs )["startup_script" ]
135149
136- def delete_script (self , script : Union [str , dict ]):
150+ def delete_script (self , script : Union [str , dict ]) -> None :
137151 script_id = self ._get_obj_key (script )
138152 url = f"{ self .url } /startup-scripts/{ script_id } "
139- return self ._delete ( url )
153+ return self ._req ( "delete" , url )
140154
141- def list_ipv4 (self , instance : Union [str , dict ], params : Optional [dict ] = None ):
155+ def list_ipv4 (self , instance : Union [str , dict ], params : Optional [dict ] = None ) -> list :
142156 instance_id = self ._get_obj_key (instance )
143157 url = f"{ self .url } /instances/{ instance_id } /ipv4"
144- return self ._get ( url , params )["ipv4s" ]
158+ return self ._req ( "get" , url , params )["ipv4s" ]
145159
146- def create_ipv4 (self , instance : Union [str , dict ], ** kwargs ):
160+ def create_ipv4 (self , instance : Union [str , dict ], ** kwargs ) -> dict :
147161 instance_id = self ._get_obj_key (instance )
148162 url = f"{ self .url } /instances/{ instance_id } /ipv4"
149- return self ._post ( url , kwargs )["ipv4" ]
163+ return self ._req ( "post" , url , kwargs )["ipv4" ]
150164
151- def delete_ipv4 (self , instance : Union [str , dict ]):
165+ def delete_ipv4 (self , instance : Union [str , dict ]) -> None :
152166 instance_id = self ._get_obj_key (instance )
153167 url = f"{ self .url } /instances/{ instance_id } /ipv4"
154- return self ._delete ( url )
168+ return self ._req ( "delete" , url )
155169
156170 @staticmethod
157171 def filter_list (item_list : List [dict ], value : str , key : str = "name" ) -> dict :
@@ -195,29 +209,15 @@ def filter_scripts(scripts: list, name: str) -> dict:
195209 except StopIteration :
196210 return {}
197211
198- def _get (self , url , params : Optional [dict ] = None ):
199- r = self ._session .get (url , params = params , timeout = 10 )
200- if not r .ok :
201- raise VultrException (r )
202- return r .json ()
203-
204- def _post (self , url , data ):
205- r = self ._session .post (url , json = data , timeout = 10 )
206- if not r .ok :
207- raise VultrException (r )
208- return r .json ()
209-
210- def _patch (self , url , data ):
211- r = self ._session .patch (url , json = data , timeout = 10 )
212- if not r .ok :
213- raise VultrException (r )
214- return r .json ()
215-
216- def _delete (self , url ):
217- r = self ._session .delete (url , timeout = 10 )
212+ def _req (self , method , url , params : Optional [dict ] = None ) -> Any :
213+ r = self ._session .request (method , url , params = params , timeout = 10 )
218214 if not r .ok :
219215 raise VultrException (r )
220- return None
216+ if r .status_code == 204 :
217+ return None
218+ if r .headers .get ("content-type" ) == "application/json" :
219+ return r .json ()
220+ return r .text
221221
222222 @staticmethod
223223 def _get_obj_key (obj , key = "id" ):
0 commit comments