diff --git a/nuon/models/__init__.py b/nuon/models/__init__.py index cf31a8a8..1f622f1a 100644 --- a/nuon/models/__init__.py +++ b/nuon/models/__init__.py @@ -211,6 +211,7 @@ AppRunnerJobExecutionOutputsOutputsAdditionalProperty, ) from .app_runner_job_execution_result import AppRunnerJobExecutionResult +from .app_runner_job_execution_result_composite_error import AppRunnerJobExecutionResultCompositeError from .app_runner_job_execution_result_error_metadata import AppRunnerJobExecutionResultErrorMetadata from .app_runner_job_execution_status import AppRunnerJobExecutionStatus from .app_runner_job_group import AppRunnerJobGroup @@ -280,6 +281,7 @@ from .cctx_signal_context import CctxSignalContext from .client_conversation import ClientConversation from .compositeerrors_composite_error_data import CompositeerrorsCompositeErrorData +from .compositeerrors_hints import CompositeerrorsHints from .compositeerrors_section import CompositeerrorsSection from .compositeerrors_severity import CompositeerrorsSeverity from .config_app_policy_engine import ConfigAppPolicyEngine @@ -931,6 +933,7 @@ "AppRunnerJobExecutionOutputsOutputs", "AppRunnerJobExecutionOutputsOutputsAdditionalProperty", "AppRunnerJobExecutionResult", + "AppRunnerJobExecutionResultCompositeError", "AppRunnerJobExecutionResultErrorMetadata", "AppRunnerJobExecutionStatus", "AppRunnerJobGroup", @@ -1000,6 +1003,7 @@ "CctxSignalContext", "ClientConversation", "CompositeerrorsCompositeErrorData", + "CompositeerrorsHints", "CompositeerrorsSection", "CompositeerrorsSeverity", "ConfigAppPolicyEngine", diff --git a/nuon/models/app_install_component.py b/nuon/models/app_install_component.py index ef42b0f3..513c2d97 100644 --- a/nuon/models/app_install_component.py +++ b/nuon/models/app_install_component.py @@ -1,7 +1,7 @@ from __future__ import annotations from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, TypeVar +from typing import TYPE_CHECKING, Any, TypeVar, cast from attrs import define as _attrs_define from attrs import field as _attrs_field @@ -30,6 +30,9 @@ class AppInstallComponent: created_at (str | Unset): created_by_id (str | Unset): drifted_object (AppDriftedObject | Unset): + enabled (bool | None | Unset): Enabled is the resolved enabled/disabled state for a toggleable component + on this install (from the synthetic enabled install input, falling back to + the component's default_enabled). It is nil for non-toggleable components. helm_chart (AppHelmChart | Unset): id (str | Unset): install_deploys (list[AppInstallDeploy] | Unset): @@ -47,6 +50,7 @@ class AppInstallComponent: created_at: str | Unset = UNSET created_by_id: str | Unset = UNSET drifted_object: AppDriftedObject | Unset = UNSET + enabled: bool | None | Unset = UNSET helm_chart: AppHelmChart | Unset = UNSET id: str | Unset = UNSET install_deploys: list[AppInstallDeploy] | Unset = UNSET @@ -74,6 +78,12 @@ def to_dict(self) -> dict[str, Any]: if not isinstance(self.drifted_object, Unset): drifted_object = self.drifted_object.to_dict() + enabled: bool | None | Unset + if isinstance(self.enabled, Unset): + enabled = UNSET + else: + enabled = self.enabled + helm_chart: dict[str, Any] | Unset = UNSET if not isinstance(self.helm_chart, Unset): helm_chart = self.helm_chart.to_dict() @@ -120,6 +130,8 @@ def to_dict(self) -> dict[str, Any]: field_dict["created_by_id"] = created_by_id if drifted_object is not UNSET: field_dict["drifted_object"] = drifted_object + if enabled is not UNSET: + field_dict["enabled"] = enabled if helm_chart is not UNSET: field_dict["helm_chart"] = helm_chart if id is not UNSET: @@ -174,6 +186,15 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: else: drifted_object = AppDriftedObject.from_dict(_drifted_object) + def _parse_enabled(data: object) -> bool | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(bool | None | Unset, data) + + enabled = _parse_enabled(d.pop("enabled", UNSET)) + _helm_chart = d.pop("helm_chart", UNSET) helm_chart: AppHelmChart | Unset if isinstance(_helm_chart, Unset): @@ -227,6 +248,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: created_at=created_at, created_by_id=created_by_id, drifted_object=drifted_object, + enabled=enabled, helm_chart=helm_chart, id=id, install_deploys=install_deploys, diff --git a/nuon/models/app_install_sandbox_run.py b/nuon/models/app_install_sandbox_run.py index e89ec0b1..cac665e9 100644 --- a/nuon/models/app_install_sandbox_run.py +++ b/nuon/models/app_install_sandbox_run.py @@ -19,6 +19,7 @@ from ..models.app_policy_report import AppPolicyReport from ..models.app_runner_job import AppRunnerJob from ..models.app_workflow import AppWorkflow + from ..models.compositeerrors_composite_error_data import CompositeerrorsCompositeErrorData T = TypeVar("T", bound="AppInstallSandboxRun") @@ -31,6 +32,7 @@ class AppInstallSandboxRun: action_workflow_runs (list[AppInstallActionWorkflowRun] | Unset): app_sandbox_config (AppAppSandboxConfig | Unset): applied_at (str | Unset): AppliedAt is set when the apply runner job completes successfully. + composite_error (CompositeerrorsCompositeErrorData | Unset): created_at (str | Unset): created_by (AppAccount | Unset): created_by_id (str | Unset): @@ -56,6 +58,7 @@ class AppInstallSandboxRun: action_workflow_runs: list[AppInstallActionWorkflowRun] | Unset = UNSET app_sandbox_config: AppAppSandboxConfig | Unset = UNSET applied_at: str | Unset = UNSET + composite_error: CompositeerrorsCompositeErrorData | Unset = UNSET created_at: str | Unset = UNSET created_by: AppAccount | Unset = UNSET created_by_id: str | Unset = UNSET @@ -92,6 +95,10 @@ def to_dict(self) -> dict[str, Any]: applied_at = self.applied_at + composite_error: dict[str, Any] | Unset = UNSET + if not isinstance(self.composite_error, Unset): + composite_error = self.composite_error.to_dict() + created_at = self.created_at created_by: dict[str, Any] | Unset = UNSET @@ -163,6 +170,8 @@ def to_dict(self) -> dict[str, Any]: field_dict["app_sandbox_config"] = app_sandbox_config if applied_at is not UNSET: field_dict["applied_at"] = applied_at + if composite_error is not UNSET: + field_dict["composite_error"] = composite_error if created_at is not UNSET: field_dict["created_at"] = created_at if created_by is not UNSET: @@ -217,6 +226,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: from ..models.app_policy_report import AppPolicyReport from ..models.app_runner_job import AppRunnerJob from ..models.app_workflow import AppWorkflow + from ..models.compositeerrors_composite_error_data import CompositeerrorsCompositeErrorData d = dict(src_dict) _action_workflow_runs = d.pop("action_workflow_runs", UNSET) @@ -237,6 +247,13 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: applied_at = d.pop("applied_at", UNSET) + _composite_error = d.pop("composite_error", UNSET) + composite_error: CompositeerrorsCompositeErrorData | Unset + if isinstance(_composite_error, Unset): + composite_error = UNSET + else: + composite_error = CompositeerrorsCompositeErrorData.from_dict(_composite_error) + created_at = d.pop("created_at", UNSET) _created_by = d.pop("created_by", UNSET) @@ -325,6 +342,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: action_workflow_runs=action_workflow_runs, app_sandbox_config=app_sandbox_config, applied_at=applied_at, + composite_error=composite_error, created_at=created_at, created_by=created_by, created_by_id=created_by_id, diff --git a/nuon/models/app_runner_job_execution_result.py b/nuon/models/app_runner_job_execution_result.py index a08f5468..a98e0900 100644 --- a/nuon/models/app_runner_job_execution_result.py +++ b/nuon/models/app_runner_job_execution_result.py @@ -9,6 +9,7 @@ from ..types import UNSET, Unset if TYPE_CHECKING: + from ..models.app_runner_job_execution_result_composite_error import AppRunnerJobExecutionResultCompositeError from ..models.app_runner_job_execution_result_error_metadata import AppRunnerJobExecutionResultErrorMetadata @@ -19,6 +20,12 @@ class AppRunnerJobExecutionResult: """ Attributes: + composite_error (AppRunnerJobExecutionResultCompositeError | Unset): CompositeError is the typed, structured + error parsed from this execution's + failure output at write time. It is the canonical, execution-scoped store + for runner-driven composite errors: strictly 1:1 with the attempt and + never reused, so it cannot go stale across retries. Aggregate rows derive + their displayed error from the latest relevant result; they do not own it. contents (str | Unset): contents_display (str | Unset): contents_display_gzip (str | Unset): @@ -34,6 +41,7 @@ class AppRunnerJobExecutionResult: updated_at (str | Unset): """ + composite_error: AppRunnerJobExecutionResultCompositeError | Unset = UNSET contents: str | Unset = UNSET contents_display: str | Unset = UNSET contents_display_gzip: str | Unset = UNSET @@ -50,6 +58,10 @@ class AppRunnerJobExecutionResult: additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: + composite_error: dict[str, Any] | Unset = UNSET + if not isinstance(self.composite_error, Unset): + composite_error = self.composite_error.to_dict() + contents = self.contents contents_display = self.contents_display @@ -81,6 +93,8 @@ def to_dict(self) -> dict[str, Any]: field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) field_dict.update({}) + if composite_error is not UNSET: + field_dict["composite_error"] = composite_error if contents is not UNSET: field_dict["contents"] = contents if contents_display is not UNSET: @@ -112,9 +126,17 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.app_runner_job_execution_result_composite_error import AppRunnerJobExecutionResultCompositeError from ..models.app_runner_job_execution_result_error_metadata import AppRunnerJobExecutionResultErrorMetadata d = dict(src_dict) + _composite_error = d.pop("composite_error", UNSET) + composite_error: AppRunnerJobExecutionResultCompositeError | Unset + if isinstance(_composite_error, Unset): + composite_error = UNSET + else: + composite_error = AppRunnerJobExecutionResultCompositeError.from_dict(_composite_error) + contents = d.pop("contents", UNSET) contents_display = d.pop("contents_display", UNSET) @@ -147,6 +169,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: updated_at = d.pop("updated_at", UNSET) app_runner_job_execution_result = cls( + composite_error=composite_error, contents=contents, contents_display=contents_display, contents_display_gzip=contents_display_gzip, diff --git a/nuon/models/app_runner_job_execution_result_composite_error.py b/nuon/models/app_runner_job_execution_result_composite_error.py new file mode 100644 index 00000000..e17fdbdc --- /dev/null +++ b/nuon/models/app_runner_job_execution_result_composite_error.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="AppRunnerJobExecutionResultCompositeError") + + +@_attrs_define +class AppRunnerJobExecutionResultCompositeError: + """CompositeError is the typed, structured error parsed from this execution's + failure output at write time. It is the canonical, execution-scoped store + for runner-driven composite errors: strictly 1:1 with the attempt and + never reused, so it cannot go stale across retries. Aggregate rows derive + their displayed error from the latest relevant result; they do not own it. + + """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + app_runner_job_execution_result_composite_error = cls() + + app_runner_job_execution_result_composite_error.additional_properties = d + return app_runner_job_execution_result_composite_error + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/nuon/models/compositeerrors_composite_error_data.py b/nuon/models/compositeerrors_composite_error_data.py index d27ff4ed..8513bb14 100644 --- a/nuon/models/compositeerrors_composite_error_data.py +++ b/nuon/models/compositeerrors_composite_error_data.py @@ -10,6 +10,7 @@ from ..types import UNSET, Unset if TYPE_CHECKING: + from ..models.compositeerrors_hints import CompositeerrorsHints from ..models.compositeerrors_section import CompositeerrorsSection @@ -20,18 +21,30 @@ class CompositeerrorsCompositeErrorData: """ Attributes: - data (list[int] | Unset): + data (list[int] | Unset): Data is the typed, per-error-type payload: WHAT the error is. Closed + schema per Type. Read to render sections and by any future view. + hints (CompositeerrorsHints | Unset): message (str | Unset): sections (list[CompositeerrorsSection] | Unset): severity (CompositeerrorsSeverity | Unset): + source_id (str | Unset): SourceID / SourceType identify the row this error originated on + (polymorphic, same shape as OwnerID/OwnerType). Set at the record site, + e.g. ("runner_job_execution_results", ""). Enables a future + JOINable view without a separate error table. + source_type (str | Unset): type_ (str | Unset): + version (int | Unset): Version is the payload schema version (SchemaVersion at write time). """ data: list[int] | Unset = UNSET + hints: CompositeerrorsHints | Unset = UNSET message: str | Unset = UNSET sections: list[CompositeerrorsSection] | Unset = UNSET severity: CompositeerrorsSeverity | Unset = UNSET + source_id: str | Unset = UNSET + source_type: str | Unset = UNSET type_: str | Unset = UNSET + version: int | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: @@ -39,6 +52,10 @@ def to_dict(self) -> dict[str, Any]: if not isinstance(self.data, Unset): data = self.data + hints: dict[str, Any] | Unset = UNSET + if not isinstance(self.hints, Unset): + hints = self.hints.to_dict() + message = self.message sections: list[dict[str, Any]] | Unset = UNSET @@ -52,31 +69,53 @@ def to_dict(self) -> dict[str, Any]: if not isinstance(self.severity, Unset): severity = self.severity.value + source_id = self.source_id + + source_type = self.source_type + type_ = self.type_ + version = self.version + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) field_dict.update({}) if data is not UNSET: field_dict["data"] = data + if hints is not UNSET: + field_dict["hints"] = hints if message is not UNSET: field_dict["message"] = message if sections is not UNSET: field_dict["sections"] = sections if severity is not UNSET: field_dict["severity"] = severity + if source_id is not UNSET: + field_dict["source_id"] = source_id + if source_type is not UNSET: + field_dict["source_type"] = source_type if type_ is not UNSET: field_dict["type"] = type_ + if version is not UNSET: + field_dict["version"] = version return field_dict @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.compositeerrors_hints import CompositeerrorsHints from ..models.compositeerrors_section import CompositeerrorsSection d = dict(src_dict) data = cast(list[int], d.pop("data", UNSET)) + _hints = d.pop("hints", UNSET) + hints: CompositeerrorsHints | Unset + if isinstance(_hints, Unset): + hints = UNSET + else: + hints = CompositeerrorsHints.from_dict(_hints) + message = d.pop("message", UNSET) _sections = d.pop("sections", UNSET) @@ -95,14 +134,24 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: else: severity = CompositeerrorsSeverity(_severity) + source_id = d.pop("source_id", UNSET) + + source_type = d.pop("source_type", UNSET) + type_ = d.pop("type", UNSET) + version = d.pop("version", UNSET) + compositeerrors_composite_error_data = cls( data=data, + hints=hints, message=message, sections=sections, severity=severity, + source_id=source_id, + source_type=source_type, type_=type_, + version=version, ) compositeerrors_composite_error_data.additional_properties = d diff --git a/nuon/models/compositeerrors_hints.py b/nuon/models/compositeerrors_hints.py new file mode 100644 index 00000000..58a4eb2e --- /dev/null +++ b/nuon/models/compositeerrors_hints.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="CompositeerrorsHints") + + +@_attrs_define +class CompositeerrorsHints: + """ """ + + additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + compositeerrors_hints = cls() + + compositeerrors_hints.additional_properties = d + return compositeerrors_hints + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/nuon/models/diff_diff_key.py b/nuon/models/diff_diff_key.py index 2c99de95..69325f78 100644 --- a/nuon/models/diff_diff_key.py +++ b/nuon/models/diff_diff_key.py @@ -16,15 +16,23 @@ class DiffDiffKey: """ Attributes: + after (str | Unset): + before (str | Unset): diff (str | Unset): op (DiffOp | Unset): """ + after: str | Unset = UNSET + before: str | Unset = UNSET diff: str | Unset = UNSET op: DiffOp | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: + after = self.after + + before = self.before + diff = self.diff op: str | Unset = UNSET @@ -34,6 +42,10 @@ def to_dict(self) -> dict[str, Any]: field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) field_dict.update({}) + if after is not UNSET: + field_dict["after"] = after + if before is not UNSET: + field_dict["before"] = before if diff is not UNSET: field_dict["diff"] = diff if op is not UNSET: @@ -44,6 +56,10 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: d = dict(src_dict) + after = d.pop("after", UNSET) + + before = d.pop("before", UNSET) + diff = d.pop("diff", UNSET) _op = d.pop("op", UNSET) @@ -54,6 +70,8 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: op = DiffOp(_op) diff_diff_key = cls( + after=after, + before=before, diff=diff, op=op, ) diff --git a/nuon/models/service_toggle_install_component_request.py b/nuon/models/service_toggle_install_component_request.py index 622c62cc..80af310d 100644 --- a/nuon/models/service_toggle_install_component_request.py +++ b/nuon/models/service_toggle_install_component_request.py @@ -15,14 +15,12 @@ class ServiceToggleInstallComponentRequest: """ Attributes: - enabled (bool | Unset): + enabled (bool): plan_only (bool | Unset): - role (str | Unset): """ - enabled: bool | Unset = UNSET + enabled: bool plan_only: bool | Unset = UNSET - role: str | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: @@ -30,33 +28,28 @@ def to_dict(self) -> dict[str, Any]: plan_only = self.plan_only - role = self.role - field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) - field_dict.update({}) - if enabled is not UNSET: - field_dict["enabled"] = enabled + field_dict.update( + { + "enabled": enabled, + } + ) if plan_only is not UNSET: field_dict["plan_only"] = plan_only - if role is not UNSET: - field_dict["role"] = role return field_dict @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: d = dict(src_dict) - enabled = d.pop("enabled", UNSET) + enabled = d.pop("enabled") plan_only = d.pop("plan_only", UNSET) - role = d.pop("role", UNSET) - service_toggle_install_component_request = cls( enabled=enabled, plan_only=plan_only, - role=role, ) service_toggle_install_component_request.additional_properties = d diff --git a/pyproject.toml b/pyproject.toml index 1283839c..8ec15970 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "nuon" -version = "0.19.1020" +version = "0.19.1024" description = "A client library for accessing Nuon" authors = [] requires-python = ">=3.11" diff --git a/version.txt b/version.txt index 981f4960..7e0b4046 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.19.1020 +0.19.1024