Skip to content

Commit 5a8ce85

Browse files
authored
Merge pull request #92 from TanyaSingh369-svg/refactoring/iterator-pattern/policy
Refactor(policy): convert list method to Iterator pattern
2 parents 65ebe3e + 3f52a31 commit 5a8ce85

4 files changed

Lines changed: 33 additions & 51 deletions

File tree

examples/policy.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ def main():
8282
_print_header(f"Listing policies in organization: {args.org}")
8383

8484
list_options = PolicyListOptions(
85-
page_number=args.page,
8685
page_size=args.page_size,
8786
)
8887

@@ -93,14 +92,10 @@ def main():
9392
PolicyKind.SENTINEL if args.kind == "sentinel" else PolicyKind.OPA
9493
)
9594

96-
policy_list = client.policies.list(args.org, list_options)
97-
98-
print(f"Total policies: {policy_list.total_count}")
99-
print(f"Page {policy_list.current_page} of {policy_list.total_pages}")
100-
print()
95+
policy_iter = client.policies.list(args.org, list_options)
10196

10297
existing_policy = None
103-
for policy in policy_list.items:
98+
for policy in policy_iter:
10499
print(
105100
f"- {policy.id} | {policy.name} | kind={policy.kind} | enforcement={policy.enforcement_level}"
106101
)

src/pytfe/models/policy.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ class PolicyListOptions(BaseModel):
3838

3939
search: str | None = Field(None, alias="search[name]")
4040
kind: PolicyKind | None = Field(None, alias="filter[kind]")
41-
page_number: int | None = Field(None, alias="page[number]")
4241
page_size: int | None = Field(None, alias="page[size]")
4342

4443

src/pytfe/resources/policy.py

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
from __future__ import annotations
22

3+
from collections.abc import Iterator
4+
from typing import Any
5+
36
from ..errors import (
47
InvalidNameError,
58
InvalidOrgError,
@@ -11,7 +14,6 @@
1114
from ..models.policy import (
1215
Policy,
1316
PolicyCreateOptions,
14-
PolicyList,
1517
PolicyListOptions,
1618
PolicyUpdateOptions,
1719
)
@@ -22,35 +24,28 @@
2224
class Policies(_Service):
2325
def list(
2426
self, organization: str, options: PolicyListOptions | None = None
25-
) -> PolicyList:
26-
"""List all the policies of the given organization."""
27+
) -> Iterator[Policy]:
28+
"""Iterate all the policies of the given organization."""
2729
if not valid_string_id(organization):
2830
raise InvalidOrgError()
29-
params = (
30-
options.model_dump(by_alias=True, exclude_none=True) if options else None
31-
)
32-
r = self.t.request(
33-
"GET",
34-
f"/api/v2/organizations/{organization}/policies",
35-
params=params,
36-
)
37-
jd = r.json()
38-
items = []
39-
meta = jd.get("meta", {})
40-
pagination = meta.get("pagination", {})
41-
for d in jd.get("data", []):
42-
attrs = d.get("attributes", {})
43-
attrs["id"] = d.get("id")
44-
attrs["organization"] = d.get("relationships", {}).get("organization", {})
45-
items.append(Policy.model_validate(attrs))
46-
return PolicyList(
47-
items=items,
48-
current_page=pagination.get("current-page"),
49-
total_pages=pagination.get("total-pages"),
50-
prev_page=pagination.get("prev-page"),
51-
next_page=pagination.get("next-page"),
52-
total_count=pagination.get("total-count"),
53-
)
31+
32+
path = f"/api/v2/organizations/{organization}/policies"
33+
params: dict[str, Any] = {}
34+
35+
if options:
36+
if getattr(options, "page_size", None):
37+
params["page[size]"] = str(options.page_size)
38+
39+
def _gen() -> Iterator[Policy]:
40+
for item in self._list(path, params=params):
41+
attrs = item.get("attributes", {})
42+
attrs["id"] = item.get("id")
43+
attrs["organization"] = item.get("relationships", {}).get(
44+
"organization", {}
45+
)
46+
yield Policy.model_validate(attrs)
47+
48+
return _gen()
5449

5550
def create(self, organization: str, options: PolicyCreateOptions) -> Policy:
5651
"""Create a new policy in the given organization."""

tests/units/test_policy.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
EnforcementLevel,
1515
Policy,
1616
PolicyCreateOptions,
17-
PolicyList,
1817
PolicyUpdateOptions,
1918
)
2019
from pytfe.models.policy_set import PolicyKind
@@ -84,22 +83,16 @@ def test_list_policies_success_without_options(
8483
mock_response.json.return_value = mock_response_data
8584
mock_transport.request.return_value = mock_response
8685

87-
result = policies_service.list("org-123")
86+
result_iter = policies_service.list("org-123")
87+
items = list(result_iter)
8888

89-
mock_transport.request.assert_called_once_with(
90-
"GET", "/api/v2/organizations/org-123/policies", params=None
91-
)
89+
assert mock_transport.request.called
9290

93-
assert isinstance(result, PolicyList)
94-
assert len(result.items) == 1
95-
assert result.items[0].id == "pol-123"
96-
assert result.items[0].name == "test-policy"
97-
assert result.items[0].kind == PolicyKind.SENTINEL
98-
assert (
99-
result.items[0].enforcement_level == EnforcementLevel.ENFORCEMENT_ADVISORY
100-
)
101-
assert result.current_page == 1
102-
assert result.total_count == 1
91+
assert len(items) == 1
92+
assert items[0].id == "pol-123"
93+
assert items[0].name == "test-policy"
94+
assert items[0].kind == PolicyKind.SENTINEL
95+
assert items[0].enforcement_level == EnforcementLevel.ENFORCEMENT_ADVISORY
10396

10497
def test_create_policy_validations(self, policies_service):
10598
"""Test create method validations."""

0 commit comments

Comments
 (0)