Skip to content

Commit 65ebe3e

Browse files
authored
Merge pull request #91 from NimishaShrivastava-dev/Refactoring/iterator-pattern/run
Refactoring2/iterator pattern/run
2 parents e6305f3 + 2fea9e7 commit 65ebe3e

3 files changed

Lines changed: 106 additions & 163 deletions

File tree

examples/run.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,31 +67,31 @@ def main():
6767
)
6868

6969
try:
70-
run_list = client.runs.list(args.workspace_id, options)
70+
print("running inside run list")
71+
run_list = list(client.runs.list(args.workspace_id, options))
7172
except Exception as e:
7273
print(f"Error listing runs: {e}")
7374
if args.organization:
7475
print("Trying organization-level listing instead...")
7576
else:
7677
return
7778

78-
if "run_list" in locals():
79-
print(f"Total runs: {run_list.total_count}")
80-
print(f"Page {run_list.current_page} of {run_list.total_pages}")
79+
if "run_list" in locals() and run_list:
80+
print(f"Total runs fetched: {len(run_list)}")
8181
print()
8282

83-
for run in run_list.items:
83+
for run in run_list:
8484
print(f"- {run.id} | status={run.status} | created={run.created_at}")
8585
print(f"message: {run.message}")
8686
print(f"has_changes: {run.has_changes} | is_destroy: {run.is_destroy}")
8787

88-
if not run_list.items:
88+
if not run_list:
8989
print("No runs found.")
9090
else:
9191
# 2) Read the most recent run with details
9292
_print_header("Reading most recent run details")
9393

94-
latest_run = run_list.items[0]
94+
latest_run = run_list[0]
9595
read_options = RunReadOptions(
9696
include=[
9797
RunIncludeOpt.RUN_PLAN,
@@ -188,10 +188,12 @@ def main():
188188
status="applied,planned,errored",
189189
)
190190

191-
org_runs = client.runs.list_for_organization(args.organization, org_options)
192-
print(f"Found {len(org_runs.items)} runs across organization")
191+
org_runs = list(
192+
client.runs.list_for_organization(args.organization, org_options)
193+
)
194+
print(f"Found {len(org_runs)} runs across organization")
193195

194-
for run in org_runs.items[:3]: # Show first 3
196+
for run in org_runs[:3]: # Show first 3
195197
print(f"- {run.id} | status={run.status}")
196198
if run.workspace:
197199
print(f"workspace: {run.workspace.name}")
@@ -204,15 +206,15 @@ def main():
204206
_print_header("Run Actions Demo (Safe Mode)")
205207

206208
# Get runs first if not already available
207-
if "run_list" not in locals() or not run_list.items:
209+
if "run_list" not in locals() or not run_list:
208210
try:
209211
options = RunListOptions(page_size=1)
210-
run_list = client.runs.list(args.workspace_id, options)
212+
run_list = list(client.runs.list(args.workspace_id, options))
211213
except Exception as e:
212214
print(f"Error getting runs for actions demo: {e}")
213215
return
214216

215-
if not run_list.items:
217+
if not run_list:
216218
print("No runs available for actions demo")
217219
return
218220

src/pytfe/resources/run.py

Lines changed: 19 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
from collections.abc import Iterator
34
from typing import Any
45

56
from ..errors import (
@@ -10,14 +11,12 @@
1011
TerraformVersionValidForPlanOnlyError,
1112
)
1213
from ..models.run import (
13-
OrganizationRunList,
1414
Run,
1515
RunApplyOptions,
1616
RunCancelOptions,
1717
RunCreateOptions,
1818
RunDiscardOptions,
1919
RunForceCancelOptions,
20-
RunList,
2120
RunListForOrganizationOptions,
2221
RunListOptions,
2322
RunReadOptions,
@@ -27,63 +26,33 @@
2726

2827

2928
class Runs(_Service):
30-
def list(self, workspace_id: str, options: RunListOptions | None = None) -> RunList:
29+
def list(
30+
self, workspace_id: str, options: RunListOptions | None = None
31+
) -> Iterator[Run]:
3132
"""List all the runs of the given workspace."""
3233
if not valid_string_id(workspace_id):
3334
raise InvalidWorkspaceIDError()
34-
params = (
35-
options.model_dump(by_alias=True, exclude_none=True) if options else None
36-
)
37-
r = self.t.request(
38-
"GET",
39-
f"/api/v2/workspaces/{workspace_id}/runs",
40-
params=params,
41-
)
42-
jd = r.json()
43-
items = []
44-
meta = jd.get("meta", {})
45-
pagination = meta.get("pagination", {})
46-
for d in jd.get("data", []):
47-
attrs = d.get("attributes", {})
48-
attrs["id"] = d.get("id")
49-
items.append(Run.model_validate(attrs))
50-
return RunList(
51-
items=items,
52-
current_page=pagination.get("current-page"),
53-
total_pages=pagination.get("total-pages"),
54-
prev_page=pagination.get("prev-page"),
55-
next_page=pagination.get("next-page"),
56-
total_count=pagination.get("total-count"),
57-
)
35+
params = options.model_dump(by_alias=True) if options else {}
36+
path = f"/api/v2/workspaces/{workspace_id}/runs"
37+
for item in self._list(path, params=params):
38+
attrs = item.get("attributes", {})
39+
attrs["id"] = item.get("id")
40+
yield Run.model_validate(attrs)
5841

5942
def list_for_organization(
6043
self, organization: str, options: RunListForOrganizationOptions | None = None
61-
) -> OrganizationRunList:
44+
) -> Iterator[Run]:
6245
"""List all the runs of the given organization."""
6346
if not valid_string_id(organization):
6447
raise InvalidOrgError()
65-
params = (
66-
options.model_dump(by_alias=True, exclude_none=True) if options else None
67-
)
68-
r = self.t.request(
69-
"GET",
70-
f"/api/v2/organizations/{organization}/runs",
71-
params=params,
72-
)
73-
jd = r.json()
74-
items = []
75-
meta = jd.get("meta", {})
76-
pagination = meta.get("pagination", {})
77-
for d in jd.get("data", []):
78-
attrs = d.get("attributes", {})
79-
attrs["id"] = d.get("id")
80-
items.append(Run.model_validate(attrs))
81-
return OrganizationRunList(
82-
items=items,
83-
current_page=pagination.get("current-page"),
84-
prev_page=pagination.get("prev-page"),
85-
next_page=pagination.get("next-page"),
86-
)
48+
path = f"/api/v2/organizations/{organization}/runs"
49+
params = options.model_dump(by_alias=True, exclude_none=True) if options else {}
50+
# meta = jd.get("meta", {})
51+
# pagination = meta.get("pagination", {})
52+
for item in self._list(path, params=params):
53+
attrs = item.get("attributes", {})
54+
attrs["id"] = item.get("id")
55+
yield Run.model_validate(attrs)
8756

8857
def create(self, options: RunCreateOptions) -> Run:
8958
"""Create a new run for the given workspace."""

0 commit comments

Comments
 (0)