Skip to content

Commit 0d3f6ee

Browse files
committed
refactor(state-version-output): Iterator conversion and example added to the state-version-output
1 parent e801ed0 commit 0d3f6ee

6 files changed

Lines changed: 59 additions & 85 deletions

File tree

examples/state_versions.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,30 @@ def main():
8080

8181
# 4) List outputs for the current state version (paged)
8282
_print_header("Listing outputs (current state version)")
83-
outs = client.state_versions.list_outputs(
84-
current.id, options=StateVersionOutputsListOptions(page_size=50)
83+
outs = list(
84+
client.state_versions.list_outputs(
85+
current.id, options=StateVersionOutputsListOptions(page_size=50)
86+
)
8587
)
86-
if not outs.items:
88+
if not outs:
8789
print("No outputs found.")
88-
for o in outs.items:
90+
for o in outs:
8991
# Sensitive outputs will have value = None
9092
print(f"- {o.name}: sensitive={o.sensitive} type={o.type} value={o.value}")
9193

94+
if args.workspace_id:
95+
# 4b) List outputs for the current state version via workspace endpoint
96+
_print_header("Listing outputs via workspace endpoint")
97+
outs2 = list(
98+
client.state_version_outputs.read_current(
99+
args.workspace_id, options=StateVersionOutputsListOptions(page_size=50)
100+
)
101+
)
102+
if not outs2:
103+
print("No outputs found.")
104+
for o in outs2:
105+
print(f"- {o.name}: sensitive={o.sensitive} type={o.type} value={o.value}")
106+
92107
# 5) (Optional) Upload a new state file
93108
if args.upload:
94109
_print_header(f"Uploading new state from: {args.upload}")

src/pytfe/models/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,6 @@
299299
)
300300
from .state_version_output import (
301301
StateVersionOutput,
302-
StateVersionOutputsList,
303302
StateVersionOutputsListOptions,
304303
)
305304
from .team import (
@@ -670,7 +669,6 @@
670669
"StateVersionReadOptions",
671670
# State Version Outputs
672671
"StateVersionOutput",
673-
"StateVersionOutputsList",
674672
"StateVersionOutputsListOptions",
675673
]
676674

src/pytfe/models/state_version_output.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class StateVersionOutput(BaseModel):
1919
class StateVersionOutputsListOptions(BaseModel):
2020
model_config = ConfigDict(populate_by_name=True, validate_by_name=True)
2121

22-
page_number: int | None = Field(None, alias="page[number]")
2322
page_size: int | None = Field(None, alias="page[size]")
2423

2524

src/pytfe/resources/state_version_outputs.py

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

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

56
from ..models.state_version_output import (
67
StateVersionOutput,
7-
StateVersionOutputsList,
88
StateVersionOutputsListOptions,
99
)
1010
from ..utils import valid_string_id
@@ -42,7 +42,7 @@ def read_current(
4242
self,
4343
workspace_id: str,
4444
options: StateVersionOutputsListOptions | None = None,
45-
) -> StateVersionOutputsList:
45+
) -> Iterator[StateVersionOutput]:
4646
"""
4747
Read outputs for the workspace's current state version.
4848
Note: sensitive outputs are returned with null values by the API.
@@ -52,32 +52,13 @@ def read_current(
5252

5353
params: dict[str, Any] = {}
5454
if options:
55-
if options.page_number is not None:
56-
params["page[number]"] = options.page_number
5755
if options.page_size is not None:
5856
params["page[size]"] = options.page_size
57+
path = f"/api/v2/workspaces/{workspace_id}/current-state-version-outputs"
5958

60-
r = self.t.request(
61-
"GET",
62-
f"/api/v2/workspaces/{workspace_id}/current-state-version-outputs",
63-
params=params,
64-
)
65-
data = r.json()
66-
67-
items: list[StateVersionOutput] = []
68-
for item in data.get("data", []):
69-
attr = item.get("attributes", {}) or {}
70-
items.append(
71-
StateVersionOutput(
72-
id=_safe_str(item.get("id")),
73-
**{k.replace("-", "_"): v for k, v in attr.items()},
74-
)
59+
for d in self._list(path, params=params):
60+
attr = d.get("attributes", {}) or {}
61+
yield StateVersionOutput(
62+
id=_safe_str(d.get("id")),
63+
**{k.replace("-", "_"): v for k, v in attr.items()},
7564
)
76-
77-
meta = data.get("meta", {}).get("pagination", {}) or {}
78-
return StateVersionOutputsList(
79-
items=items,
80-
current_page=meta.get("current-page"),
81-
total_pages=meta.get("total-pages"),
82-
total_count=meta.get("total-count"),
83-
)

src/pytfe/resources/state_versions.py

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
)
1717
from ..models.state_version_output import (
1818
StateVersionOutput,
19-
StateVersionOutputsList,
2019
StateVersionOutputsListOptions,
2120
)
2221
from ..utils import looks_like_workspace_id, valid_string_id
@@ -254,40 +253,24 @@ def list_outputs(
254253
self,
255254
state_version_id: str,
256255
options: StateVersionOutputsListOptions | None = None,
257-
) -> StateVersionOutputsList:
256+
) -> Iterator[StateVersionOutput]:
258257
"""List outputs for a given state version (paged)."""
259258
if not valid_string_id(state_version_id):
260259
raise ValueError("invalid state version id")
261260

262261
params: dict[str, Any] = {}
263262
if options:
264-
if options.page_number is not None:
265-
params["page[number]"] = options.page_number
266263
if options.page_size is not None:
267264
params["page[size]"] = options.page_size
268265

269-
r = self.t.request(
270-
"GET", f"/api/v2/state-versions/{state_version_id}/outputs", params=params
271-
)
272-
data = r.json()
273-
274-
items: list[StateVersionOutput] = []
275-
for item in data.get("data", []):
276-
attr = item.get("attributes", {}) or {}
277-
items.append(
278-
StateVersionOutput(
279-
id=_safe_str(item.get("id")),
280-
**{k.replace("-", "_"): v for k, v in attr.items()},
281-
)
282-
)
266+
path = f"/api/v2/state-versions/{state_version_id}/outputs"
283267

284-
meta = data.get("meta", {}).get("pagination", {}) or {}
285-
return StateVersionOutputsList(
286-
items=items,
287-
current_page=meta.get("current-page"),
288-
total_pages=meta.get("total-pages"),
289-
total_count=meta.get("total-count"),
290-
)
268+
for d in self._list(path, params=params):
269+
attr = d.get("attributes", {}) or {}
270+
yield StateVersionOutput(
271+
id=_safe_str(d.get("id")),
272+
**{k.replace("-", "_"): v for k, v in attr.items()},
273+
)
291274

292275
# ----------------------------
293276
# TFE-only backing data actions

tests/units/test_state_version.py

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -287,31 +287,29 @@ def test_download_state_version_success(
287287
)
288288
assert result == b"{}"
289289

290-
def test_list_outputs_success(self, state_versions_service, mock_transport):
291-
"""Test successful list_outputs() operation."""
292-
mock_response = Mock()
293-
mock_response.json.return_value = {
294-
"data": [
295-
{
296-
"id": "wsout-1",
297-
"attributes": {
298-
"name": "vpc_id",
299-
"sensitive": False,
300-
"type": "string",
301-
"value": "vpc-123",
302-
},
303-
}
304-
],
305-
}
306-
mock_transport.request.return_value = mock_response
290+
def test_list_outputs_success(self, state_versions_service):
291+
"""Test successful list_outputs() iterator operation."""
292+
mock_items = [
293+
{
294+
"id": "wsout-1",
295+
"attributes": {
296+
"name": "vpc_id",
297+
"sensitive": False,
298+
"type": "string",
299+
"value": "vpc-123",
300+
},
301+
}
302+
]
303+
304+
with patch.object(state_versions_service, "_list") as mock_list:
305+
mock_list.return_value = mock_items
307306

308-
options = StateVersionOutputsListOptions(page_number=1, page_size=5)
309-
result = state_versions_service.list_outputs("sv-outputs-1", options)
307+
options = StateVersionOutputsListOptions(page_size=5)
308+
result = list(state_versions_service.list_outputs("sv-outputs-1", options))
310309

311-
mock_transport.request.assert_called_once_with(
312-
"GET",
313-
"/api/v2/state-versions/sv-outputs-1/outputs",
314-
params={"page[number]": 1, "page[size]": 5},
315-
)
316-
assert len(result.items) == 1
317-
assert result.items[0].id == "wsout-1"
310+
mock_list.assert_called_once_with(
311+
"/api/v2/state-versions/sv-outputs-1/outputs",
312+
params={"page[size]": 5},
313+
)
314+
assert len(result) == 1
315+
assert result[0].id == "wsout-1"

0 commit comments

Comments
 (0)