Skip to content

Commit ddf36d6

Browse files
authored
new: Add beta object and group (#321)
## 📝 Description Implement self serve beta in python SDK. Create `beta` object and group to support existing beta program endpoints: ``` GET /betas/:id GET /betas ``` ## ✔️ How to Test `tox`
1 parent 6ff915b commit ddf36d6

10 files changed

Lines changed: 139 additions & 3 deletions

File tree

linode_api4/groups/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from .group import * # isort: skip
33

44
from .account import *
5+
from .beta import *
56
from .database import *
67
from .domain import *
78
from .image import *

linode_api4/groups/beta.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from linode_api4.groups import Group
2+
from linode_api4.objects import BetaProgram
3+
4+
5+
class BetaProgramGroup(Group):
6+
"""
7+
This group encapsulates all endpoints under /betas, including viewing
8+
available active beta programs.
9+
"""
10+
11+
def betas(self, *filters):
12+
"""
13+
Returns a list of available active Beta Programs.
14+
15+
API Documentation: TBD
16+
17+
:param filters: Any number of filters to apply to this query.
18+
See :doc:`Filtering Collections</linode_api4/objects/filtering>`
19+
for more details on filtering.
20+
21+
:returns: A list of Beta Programs that matched the query.
22+
:rtype: PaginatedList of BetaProgram
23+
"""
24+
return self.client._get_and_filter(BetaProgram, *filters)

linode_api4/linode_client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from linode_api4.errors import ApiError, UnexpectedResponseError
1313
from linode_api4.groups import (
1414
AccountGroup,
15+
BetaProgramGroup,
1516
DatabaseGroup,
1617
DomainGroup,
1718
ImageGroup,
@@ -188,6 +189,9 @@ def __init__(
188189
#: Access methods related to Event polling - See :any:`PollingGroup` for more information.
189190
self.polling = PollingGroup(self)
190191

192+
#: Access methods related to Beta Program - See :any:`BetaProgramGroup` for more information.
193+
self.beta = BetaProgramGroup(self)
194+
191195
@property
192196
def _user_agent(self):
193197
return "{}python-linode_api4/{} {}".format(

linode_api4/objects/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@
1717
from .object_storage import *
1818
from .lke import *
1919
from .database import *
20+
from .beta import *

linode_api4/objects/beta.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from linode_api4.objects import Base, Property
2+
3+
4+
class BetaProgram(Base):
5+
"""
6+
Beta program is a new product or service that's not generally available to all customers.
7+
User with permissions can enroll into a beta program and access the functionalities.
8+
9+
API Documentation: TBD
10+
"""
11+
12+
api_endpoint = "/betas/{id}"
13+
14+
properties = {
15+
"id": Property(identifier=True),
16+
"label": Property(),
17+
"description": Property(),
18+
"started": Property(is_datetime=True),
19+
"ended": Property(is_datetime=True),
20+
"greenlight_only": Property(),
21+
"more_info": Property(),
22+
}

test/fixtures/betas.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"data": [
3+
{
4+
"id": "active_closed",
5+
"label": "active closed beta",
6+
"description": "An active closed beta",
7+
"started": "2023-07-19T15:23:43",
8+
"ended": null,
9+
"greenlight_only": true,
10+
"more_info": "a link with even more info"
11+
},
12+
{
13+
"id": "limited",
14+
"label": "limited beta",
15+
"description": "An active limited beta",
16+
"started": "2023-07-19T15:23:43",
17+
"ended": null, "greenlight_only": false,
18+
"more_info": "a link with even more info"
19+
}
20+
],
21+
"page": 1,
22+
"pages": 1,
23+
"results": 2
24+
}

test/fixtures/betas_active.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"id": "active",
3+
"label": "active closed beta",
4+
"description": "An active closed beta",
5+
"started": "2018-01-02T03:04:05",
6+
"ended": null,
7+
"greenlight_only": true,
8+
"more_info": "a link with even more info"
9+
}

test/unit/linode_client_test.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,27 @@ def test_payments(self):
412412
self.assertEqual(payment.usd, 1000)
413413

414414

415+
class BetaProgramGroupTest(ClientBaseCase):
416+
"""
417+
Tests methods of the BetaProgramGroup
418+
"""
419+
420+
def test_betas(self):
421+
"""
422+
Test that available beta programs can be retrieved
423+
"""
424+
betas = self.client.beta.betas()
425+
426+
self.assertEqual(len(betas), 2)
427+
beta = betas[0]
428+
self.assertEqual(beta.id, "active_closed")
429+
self.assertEqual(beta.label, "active closed beta")
430+
self.assertEqual(beta.started, datetime(2023, 7, 19, 15, 23, 43))
431+
self.assertEqual(beta.ended, None)
432+
self.assertEqual(beta.greenlight_only, True)
433+
self.assertEqual(beta.more_info, "a link with even more info")
434+
435+
415436
class LinodeGroupTest(ClientBaseCase):
416437
"""
417438
Tests methods of the LinodeGroup

test/unit/objects/beta_test.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from datetime import datetime
2+
from test.unit.base import ClientBaseCase
3+
4+
from linode_api4.objects import BetaProgram
5+
6+
7+
class BetaProgramTest(ClientBaseCase):
8+
"""
9+
Test the methods of the Beta Program.
10+
"""
11+
12+
def test_beta_program_api_get(self):
13+
beta_id = "active"
14+
beta_program_api_get_url = "/betas/{}".format(beta_id)
15+
16+
with self.mock_get(beta_program_api_get_url) as m:
17+
beta_program = BetaProgram(self.client, beta_id)
18+
self.assertEqual(beta_program.id, beta_id)
19+
self.assertEqual(beta_program.label, "active closed beta")
20+
self.assertEqual(beta_program.description, "An active closed beta")
21+
self.assertEqual(
22+
beta_program.started, datetime(2018, 1, 2, 3, 4, 5)
23+
)
24+
self.assertEqual(beta_program.ended, None)
25+
self.assertEqual(beta_program.greenlight_only, True)
26+
self.assertEqual(
27+
beta_program.more_info, "a link with even more info"
28+
)
29+
30+
self.assertEqual(m.call_url, beta_program_api_get_url)

test/unit/objects/linode_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ def test_firewalls(self):
259259
with self.mock_get("/linode/instances/123/firewalls") as m:
260260
result = linode.firewalls()
261261
self.assertEqual(m.call_url, "/linode/instances/123/firewalls")
262-
self.assertEquals(len(result), 1)
262+
self.assertEqual(len(result), 1)
263263

264264
def test_volumes(self):
265265
"""
@@ -270,7 +270,7 @@ def test_volumes(self):
270270
with self.mock_get("/linode/instances/123/volumes") as m:
271271
result = linode.volumes()
272272
self.assertEqual(m.call_url, "/linode/instances/123/volumes")
273-
self.assertEquals(len(result), 1)
273+
self.assertEqual(len(result), 1)
274274

275275
def test_nodebalancers(self):
276276
"""
@@ -281,7 +281,7 @@ def test_nodebalancers(self):
281281
with self.mock_get("/linode/instances/123/nodebalancers") as m:
282282
result = linode.nodebalancers()
283283
self.assertEqual(m.call_url, "/linode/instances/123/nodebalancers")
284-
self.assertEquals(len(result), 1)
284+
self.assertEqual(len(result), 1)
285285

286286
def test_transfer_year_month(self):
287287
"""

0 commit comments

Comments
 (0)