Skip to content

Commit 43a62a9

Browse files
committed
Add Return Types and PUT Method
1 parent 0afc4f7 commit 43a62a9

4 files changed

Lines changed: 84 additions & 80 deletions

File tree

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,14 @@ data = {
107107
instance = vultr.create_instance(available[0], plan, **data)
108108
```
109109

110-
Arbitrary Methods `get`, `post`, `patch`, `delete`
110+
Arbitrary Methods `get`, `post`, `patch`, `put`, `delete`
111111

112112
```python
113113
plans = vultr.get('plans', {'type': 'vc2'})
114114
sshkey = vultr.post('ssh-keys', name='key-name', ssh_key='ssh-rsa AAAA...')
115115
instance = vultr.patch('instances', plan=plans[1]['id'])
116-
vultr.delete(f"instances/019ad1a8-2aa3-7650-83d1-8520d65ed6af")
116+
instance = vultr.patch('blocks/{block-id}', plan=plans[1]['id'])
117+
vultr.delete("instances/{instance-id}")
117118
```
118119

119120
Error Handling

docs/index.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,14 @@ data = {
8585
instance = vultr.create_instance(available[0], plan, **data)
8686
```
8787

88-
Arbitrary Methods `get`, `post`, `patch`, `delete`
88+
Arbitrary Methods [get](#Vultr.get), [post](#Vultr.post), [patch](#Vultr.patch), [put](#Vultr.put), [delete](#Vultr.delete)
8989

9090
```python
9191
plans = vultr.get('plans', {'type': 'vc2'})
9292
sshkey = vultr.post('ssh-keys', name='key-name', ssh_key='ssh-rsa AAAA...')
9393
instance = vultr.patch('instances', plan=plans[1]['id'])
94-
vultr.delete(f"instances/019ad1a8-2aa3-7650-83d1-8520d65ed6af")
94+
instance = vultr.patch('blocks/{block-id}', plan=plans[1]['id'])
95+
vultr.delete("instances/{instance-id}")
9596
```
9697

9798
Error Handling

src/vultr/vultr.py

Lines changed: 74 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import os
22
import warnings
3-
from typing import List, Optional, Union
3+
from typing import Any, List, Optional, Union
44

55
import 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"):

tests/test_all.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ def test_basic():
1010
print(f"plans: {len(plans['plans'])}")
1111
assert len(plans["plans"]) == min(plans["meta"]["total"], per_page)
1212

13-
plan = vultr.filter_list(plans["plans"], "vc2-1c-1gb", "id")
14-
assert plan.get("id") == "vc2-1c-1gb"
13+
plan_id = "vc2-1c-1gb"
14+
plan = vultr.filter_list(plans["plans"], plan_id, "id")
15+
print(f"plan: {plan}")
16+
assert plan.get("id") == plan_id
1517

1618
# regions = vultr.list_regions({"per_page": per_page})
1719
# print(f"regions: {len(regions)}")

0 commit comments

Comments
 (0)