Skip to content

Commit 7b2b1a7

Browse files
committed
Add Query Params and Basic Functionality Test
1 parent a7779af commit 7b2b1a7

File tree

5 files changed

+142
-50
lines changed

5 files changed

+142
-50
lines changed

.github/workflows/test.yaml

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
name: "Test"
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches: [master]
7+
#paths: &paths
8+
paths:
9+
- ".github/workflows/test.yaml"
10+
- "src/**"
11+
- "tests/**"
12+
- "pyproject.toml"
13+
#pull_request:
14+
# paths: *paths
15+
16+
jobs:
17+
build:
18+
name: "Build"
19+
if: ${{ !contains(github.event.head_commit.message, '#notest') }}
20+
uses: ./.github/workflows/build.yaml
21+
with:
22+
name: test
23+
24+
permissions:
25+
contents: read
26+
27+
test:
28+
runs-on: ubuntu-latest
29+
timeout-minutes: 5
30+
needs: [build]
31+
strategy:
32+
fail-fast: false
33+
matrix:
34+
version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
35+
name: "Test ${{ matrix.version }}"
36+
37+
permissions:
38+
contents: read
39+
40+
steps:
41+
- name: "Checkout"
42+
uses: actions/checkout@v6
43+
44+
- name: "Debug event.json"
45+
if: ${{ !github.event.act }}
46+
continue-on-error: true
47+
run: cat "${GITHUB_EVENT_PATH}"
48+
49+
- name: "Debug CTX github"
50+
if: ${{ !github.event.act }}
51+
continue-on-error: true
52+
env:
53+
GITHUB_CTX: ${{ toJSON(github) }}
54+
run: echo "$GITHUB_CTX"
55+
56+
- name: "Debug Environment"
57+
if: ${{ !github.event.act }}
58+
continue-on-error: true
59+
run: env
60+
61+
- name: "Download Artifact"
62+
uses: actions/download-artifact@v6
63+
with:
64+
name: test
65+
path: dist
66+
67+
- name: "Setup Python ${{ matrix.version }}"
68+
uses: actions/setup-python@v6
69+
with:
70+
python-version: ${{ matrix.version }}
71+
cache: "pip"
72+
73+
- name: "Install ${{ matrix.version }}"
74+
run: |
75+
python -V
76+
python -m pip install -U pip pytest
77+
python -m pip install dist/*.whl
78+
79+
#- name: "Debug ${{ matrix.version }}"
80+
# run: |
81+
# ls -lAhR dist/
82+
83+
- name: "Test ${{ matrix.version }}"
84+
#continue-on-error: ${{ contains('dev', matrix.version) }}
85+
run: |
86+
pytest -s

README.md

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ vultr = Vultr('VULTR_API_KEY')
7676
List plans and get available regions for that plan
7777

7878
```python
79-
plans = vultr.list_plans()
80-
plan = plans[0] # 0 seems to be the basic 5 dollar plan
79+
plans = vultr.list_plans({'type': 'vc2'}) # vc2 - Cloud Compute
80+
plan = plans[0] # 0 seems to be the base plan
8181
regions = vultr.list_regions()
8282
available = vultr.filter_regions(regions, plan['locations'])
8383
```
@@ -98,26 +98,23 @@ sshkey = vultr.create_key('key-name', 'ssh-rsa AAAA...')
9898
Create a new instance
9999

100100
```python
101-
hostname = 'my-new-host'
102101
data = {
103-
'region': available[0]['id'],
104-
'plan': plan['id'],
105102
'os_id': ubuntu_lts['id'],
106103
'sshkey_id': [sshkey['id']],
107-
'hostname': hostname,
108-
'label': hostname,
104+
'hostname': 'my-new-host',
105+
'label': 'my-new-host',
109106
}
110-
instance = vultr.create_instance(**data)
107+
instance = vultr.create_instance(available[0], plan, **data)
111108
```
112109

113110
Arbitrary Methods `get`, `post`, `patch`, `delete`
114111

115112
```python
116-
# vultr.list_instances()
117-
instances = vultr.get('instances')
118-
# vultr.create_key()
113+
# vultr.get('url', params)
114+
instances = vultr.get('instances', {'type': 'vc2'})
115+
# vultr.post('url', **kwargs)
119116
sshkey = vultr.post('ssh-keys', name='key-name', ssh_key='ssh-rsa AAAA...')
120-
# vultr.delete_instance()
117+
# vultr.delete('url')
121118
vultr.delete(f"instances/019ad1a8-2aa3-7650-83d1-8520d65ed6af")
122119
```
123120

docs/index.md

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ vultr = Vultr('VULTR_API_KEY')
5454
List plans and get available regions for that plan
5555

5656
```python
57-
plans = vultr.list_plans()
58-
plan = plans[0] # 0 seems to be the basic 5 dollar plan
57+
plans = vultr.list_plans({'type': 'vc2'}) # vc2 - Cloud Compute
58+
plan = plans[0] # 0 seems to be the base plan
5959
regions = vultr.list_regions()
6060
available = vultr.filter_regions(regions, plan['locations'])
6161
```
@@ -76,26 +76,23 @@ sshkey = vultr.create_key('key-name', 'ssh-rsa AAAA...')
7676
Create a new instance
7777

7878
```python
79-
hostname = 'my-new-host'
8079
data = {
81-
'region': available[0]['id'],
82-
'plan': plan['id'],
8380
'os_id': ubuntu_lts['id'],
8481
'sshkey_id': [sshkey['id']],
85-
'hostname': hostname,
86-
'label': hostname,
82+
'hostname': 'my-new-host',
83+
'label': 'my-new-host',
8784
}
88-
instance = vultr.create_instance(**data)
85+
instance = vultr.create_instance(available[0], plan, **data)
8986
```
9087

9188
Arbitrary Methods `get`, `post`, `patch`, `delete`
9289

9390
```python
94-
# vultr.list_instances()
95-
instances = vultr.get('instances')
96-
# vultr.create_key()
91+
# vultr.get('url', params)
92+
instances = vultr.get('instances', {'type': 'vc2'})
93+
# vultr.post('url', **kwargs)
9794
sshkey = vultr.post('ssh-keys', name='key-name', ssh_key='ssh-rsa AAAA...')
98-
# vultr.delete_instance()
95+
# vultr.delete('url')
9996
vultr.delete(f"instances/019ad1a8-2aa3-7650-83d1-8520d65ed6af")
10097
```
10198

src/vultr/vultr.py

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ 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):
20-
return self._get(f"{self.url}/{url.lstrip('/')}")
19+
def get(self, url: str, params: Optional[dict] = None):
20+
return self._get(f"{self.url}/{url.lstrip('/')}", params)
2121

2222
def post(self, url: str, **kwargs):
2323
return self._post(f"{self.url}/{url.lstrip('/')}", kwargs)
@@ -28,29 +28,31 @@ def patch(self, url: str, **kwargs):
2828
def delete(self, url: str):
2929
return self._delete(f"{self.url}/{url.lstrip('/')}")
3030

31-
def list_os(self):
31+
def list_os(self, params: Optional[dict] = None):
3232
url = f"{self.url}/os"
33-
return self._get(url)["os"]
33+
return self._get(url, params)["os"]
3434

35-
def list_plans(self):
35+
def list_plans(self, params: Optional[dict] = None):
3636
url = f"{self.url}/plans"
37-
return self._get(url)["plans"]
37+
return self._get(url, params)["plans"]
3838

39-
def list_regions(self):
39+
def list_regions(self, params: Optional[dict] = None):
4040
url = f"{self.url}/regions"
41-
return self._get(url)["regions"]
41+
return self._get(url, params)["regions"]
4242

43-
def list_instances(self):
43+
def list_instances(self, params: Optional[dict] = None):
4444
url = f"{self.url}/instances"
45-
return self._get(url)["instances"]
45+
return self._get(url, params)["instances"]
4646

47-
def get_instance(self, instance: Union[str, dict]):
47+
def get_instance(self, instance: Union[str, dict], params: Optional[dict] = None):
4848
instance_id = self._get_obj_key(instance)
4949
url = f"{self.url}/instances/{instance_id}"
50-
return self._get(url)["instance"]
50+
return self._get(url, params)["instance"]
5151

52-
def create_instance(self, region: str, plan: str, **kwargs):
53-
data = {"region": region, "plan": plan}
52+
def create_instance(
53+
self, region: Union[str, dict], plan: Union[str, dict], **kwargs
54+
):
55+
data = {"region": self._get_obj_key(region), "plan": self._get_obj_key(plan)}
5456
data.update(kwargs)
5557
url = f"{self.url}/instances"
5658
return self._post(url, data)["instance"]
@@ -65,14 +67,14 @@ def delete_instance(self, instance: Union[str, dict]):
6567
url = f"{self.url}/instances/{instance_id}"
6668
return self._delete(url)
6769

68-
def list_keys(self):
70+
def list_keys(self, params: Optional[dict] = None):
6971
url = f"{self.url}/ssh-keys"
70-
return self._get(url)["ssh_keys"]
72+
return self._get(url, params)["ssh_keys"]
7173

72-
def get_key(self, key: Union[str, dict]):
74+
def get_key(self, key: Union[str, dict], params: Optional[dict] = None):
7375
key_id = self._get_obj_key(key)
7476
url = f"{self.url}/ssh-keys/{key_id}"
75-
return self._get(url)["ssh_key"]
77+
return self._get(url, params)["ssh_key"]
7678

7779
def create_key(self, name: str, key: str, **kwargs):
7880
data = {"name": name, "ssh_key": key}
@@ -90,14 +92,14 @@ def delete_key(self, key: Union[str, dict]):
9092
url = f"{self.url}/ssh-keys/{key_id}"
9193
return self._delete(url)
9294

93-
def list_scripts(self):
95+
def list_scripts(self, params: Optional[dict] = None):
9496
url = f"{self.url}/startup-scripts"
95-
return self._get(url)["startup_scripts"]
97+
return self._get(url, params)["startup_scripts"]
9698

97-
def get_script(self, script: Union[str, dict]):
99+
def get_script(self, script: Union[str, dict], params: Optional[dict] = None):
98100
script_id = self._get_obj_key(script)
99101
url = f"{self.url}/startup-scripts/{script_id}"
100-
return self._get(url)["startup_script"]
102+
return self._get(url, params)["startup_script"]
101103

102104
def create_script(self, name: str, script: str, **kwargs):
103105
data = {"name": name, "script": script}
@@ -115,10 +117,10 @@ def delete_script(self, script: Union[str, dict]):
115117
url = f"{self.url}/startup-scripts/{script_id}"
116118
return self._delete(url)
117119

118-
def list_ipv4(self, instance: Union[str, dict]):
120+
def list_ipv4(self, instance: Union[str, dict], params: Optional[dict] = None):
119121
instance_id = self._get_obj_key(instance)
120122
url = f"{self.url}/instances/{instance_id}/ipv4"
121-
return self._get(url)["ipv4s"]
123+
return self._get(url, params)["ipv4s"]
122124

123125
def create_ipv4(self, instance: Union[str, dict], **kwargs):
124126
instance_id = self._get_obj_key(instance)
@@ -155,8 +157,8 @@ def filter_scripts(scripts: list, name: str) -> dict:
155157
def filter_regions(regions: list, locations: list) -> list:
156158
return [d for d in regions if d["id"] in locations]
157159

158-
def _get(self, url):
159-
r = self._session.get(url, timeout=10)
160+
def _get(self, url, params: Optional[dict] = None):
161+
r = self._session.get(url, params=params, timeout=10)
160162
if not r.ok:
161163
r.raise_for_status()
162164
return r.json()

tests/test_all.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from vultr import Vultr
2+
3+
4+
vultr = Vultr()
5+
6+
7+
def test_free():
8+
per_page = 100
9+
plans = vultr.get("plans", {"type": "vc2", "per_page": per_page})
10+
assert len(plans["plans"]) == min(plans["meta"]["total"], per_page)

0 commit comments

Comments
 (0)