fal 0.12.2__py3-none-any.whl → 0.12.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of fal might be problematic. Click here for more details.

Files changed (46) hide show
  1. fal/__init__.py +11 -2
  2. fal/api.py +130 -50
  3. fal/app.py +81 -134
  4. fal/apps.py +24 -6
  5. fal/auth/__init__.py +14 -2
  6. fal/auth/auth0.py +34 -25
  7. fal/cli.py +9 -4
  8. fal/env.py +0 -4
  9. fal/flags.py +1 -0
  10. fal/logging/__init__.py +0 -2
  11. fal/logging/trace.py +8 -1
  12. fal/sdk.py +33 -6
  13. fal/toolkit/__init__.py +16 -0
  14. fal/workflows.py +481 -0
  15. {fal-0.12.2.dist-info → fal-0.12.4.dist-info}/METADATA +4 -7
  16. fal-0.12.4.dist-info/RECORD +88 -0
  17. openapi_fal_rest/__init__.py +1 -0
  18. openapi_fal_rest/api/workflows/__init__.py +0 -0
  19. openapi_fal_rest/api/workflows/create_or_update_workflow_workflows_post.py +172 -0
  20. openapi_fal_rest/api/workflows/delete_workflow_workflows_user_id_workflow_name_delete.py +175 -0
  21. openapi_fal_rest/api/workflows/execute_workflow_workflows_user_id_workflow_name_post.py +268 -0
  22. openapi_fal_rest/api/workflows/get_workflow_workflows_user_id_workflow_name_get.py +181 -0
  23. openapi_fal_rest/api/workflows/get_workflows_workflows_get.py +189 -0
  24. openapi_fal_rest/models/__init__.py +34 -0
  25. openapi_fal_rest/models/app_metadata_response_app_metadata.py +1 -0
  26. openapi_fal_rest/models/customer_details.py +15 -14
  27. openapi_fal_rest/models/execute_workflow_workflows_user_id_workflow_name_post_json_body_type_0.py +44 -0
  28. openapi_fal_rest/models/execute_workflow_workflows_user_id_workflow_name_post_response_200_type_0.py +44 -0
  29. openapi_fal_rest/models/page_workflow_item.py +107 -0
  30. openapi_fal_rest/models/typed_workflow.py +85 -0
  31. openapi_fal_rest/models/workflow_contents.py +98 -0
  32. openapi_fal_rest/models/workflow_contents_nodes.py +59 -0
  33. openapi_fal_rest/models/workflow_contents_output.py +44 -0
  34. openapi_fal_rest/models/workflow_detail.py +149 -0
  35. openapi_fal_rest/models/workflow_detail_contents_type_0.py +44 -0
  36. openapi_fal_rest/models/workflow_item.py +80 -0
  37. openapi_fal_rest/models/workflow_node.py +74 -0
  38. openapi_fal_rest/models/workflow_node_type.py +9 -0
  39. openapi_fal_rest/models/workflow_schema.py +73 -0
  40. openapi_fal_rest/models/workflow_schema_input.py +44 -0
  41. openapi_fal_rest/models/workflow_schema_output.py +44 -0
  42. openapi_fal_rest/types.py +1 -0
  43. fal/logging/datadog.py +0 -78
  44. fal-0.12.2.dist-info/RECORD +0 -67
  45. {fal-0.12.2.dist-info → fal-0.12.4.dist-info}/WHEEL +0 -0
  46. {fal-0.12.2.dist-info → fal-0.12.4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,107 @@
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
2
+
3
+ import attr
4
+
5
+ from ..types import UNSET, Unset
6
+
7
+ if TYPE_CHECKING:
8
+ from ..models.workflow_item import WorkflowItem
9
+
10
+
11
+ T = TypeVar("T", bound="PageWorkflowItem")
12
+
13
+
14
+ @attr.s(auto_attribs=True)
15
+ class PageWorkflowItem:
16
+ """
17
+ Attributes:
18
+ items (List['WorkflowItem']):
19
+ total (Union[Unset, int]):
20
+ page (Union[Unset, int]):
21
+ size (Union[Unset, int]):
22
+ pages (Union[Unset, int]):
23
+ """
24
+
25
+ items: List["WorkflowItem"]
26
+ total: Union[Unset, int] = UNSET
27
+ page: Union[Unset, int] = UNSET
28
+ size: Union[Unset, int] = UNSET
29
+ pages: Union[Unset, int] = UNSET
30
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
31
+
32
+ def to_dict(self) -> Dict[str, Any]:
33
+ items = []
34
+ for items_item_data in self.items:
35
+ items_item = items_item_data.to_dict()
36
+
37
+ items.append(items_item)
38
+
39
+ total = self.total
40
+ page = self.page
41
+ size = self.size
42
+ pages = self.pages
43
+
44
+ field_dict: Dict[str, Any] = {}
45
+ field_dict.update(self.additional_properties)
46
+ field_dict.update(
47
+ {
48
+ "items": items,
49
+ }
50
+ )
51
+ if total is not UNSET:
52
+ field_dict["total"] = total
53
+ if page is not UNSET:
54
+ field_dict["page"] = page
55
+ if size is not UNSET:
56
+ field_dict["size"] = size
57
+ if pages is not UNSET:
58
+ field_dict["pages"] = pages
59
+
60
+ return field_dict
61
+
62
+ @classmethod
63
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
64
+ from ..models.workflow_item import WorkflowItem
65
+
66
+ d = src_dict.copy()
67
+ items = []
68
+ _items = d.pop("items")
69
+ for items_item_data in _items:
70
+ items_item = WorkflowItem.from_dict(items_item_data)
71
+
72
+ items.append(items_item)
73
+
74
+ total = d.pop("total", UNSET)
75
+
76
+ page = d.pop("page", UNSET)
77
+
78
+ size = d.pop("size", UNSET)
79
+
80
+ pages = d.pop("pages", UNSET)
81
+
82
+ page_workflow_item = cls(
83
+ items=items,
84
+ total=total,
85
+ page=page,
86
+ size=size,
87
+ pages=pages,
88
+ )
89
+
90
+ page_workflow_item.additional_properties = d
91
+ return page_workflow_item
92
+
93
+ @property
94
+ def additional_keys(self) -> List[str]:
95
+ return list(self.additional_properties.keys())
96
+
97
+ def __getitem__(self, key: str) -> Any:
98
+ return self.additional_properties[key]
99
+
100
+ def __setitem__(self, key: str, value: Any) -> None:
101
+ self.additional_properties[key] = value
102
+
103
+ def __delitem__(self, key: str) -> None:
104
+ del self.additional_properties[key]
105
+
106
+ def __contains__(self, key: str) -> bool:
107
+ return key in self.additional_properties
@@ -0,0 +1,85 @@
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ if TYPE_CHECKING:
6
+ from ..models.workflow_contents import WorkflowContents
7
+
8
+
9
+ T = TypeVar("T", bound="TypedWorkflow")
10
+
11
+
12
+ @attr.s(auto_attribs=True)
13
+ class TypedWorkflow:
14
+ """
15
+ Attributes:
16
+ name (str):
17
+ title (str):
18
+ contents (WorkflowContents):
19
+ is_public (bool):
20
+ """
21
+
22
+ name: str
23
+ title: str
24
+ contents: "WorkflowContents"
25
+ is_public: bool
26
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
27
+
28
+ def to_dict(self) -> Dict[str, Any]:
29
+ name = self.name
30
+ title = self.title
31
+ contents = self.contents.to_dict()
32
+
33
+ is_public = self.is_public
34
+
35
+ field_dict: Dict[str, Any] = {}
36
+ field_dict.update(self.additional_properties)
37
+ field_dict.update(
38
+ {
39
+ "name": name,
40
+ "title": title,
41
+ "contents": contents,
42
+ "is_public": is_public,
43
+ }
44
+ )
45
+
46
+ return field_dict
47
+
48
+ @classmethod
49
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
50
+ from ..models.workflow_contents import WorkflowContents
51
+
52
+ d = src_dict.copy()
53
+ name = d.pop("name")
54
+
55
+ title = d.pop("title")
56
+
57
+ contents = WorkflowContents.from_dict(d.pop("contents"))
58
+
59
+ is_public = d.pop("is_public")
60
+
61
+ typed_workflow = cls(
62
+ name=name,
63
+ title=title,
64
+ contents=contents,
65
+ is_public=is_public,
66
+ )
67
+
68
+ typed_workflow.additional_properties = d
69
+ return typed_workflow
70
+
71
+ @property
72
+ def additional_keys(self) -> List[str]:
73
+ return list(self.additional_properties.keys())
74
+
75
+ def __getitem__(self, key: str) -> Any:
76
+ return self.additional_properties[key]
77
+
78
+ def __setitem__(self, key: str, value: Any) -> None:
79
+ self.additional_properties[key] = value
80
+
81
+ def __delitem__(self, key: str) -> None:
82
+ del self.additional_properties[key]
83
+
84
+ def __contains__(self, key: str) -> bool:
85
+ return key in self.additional_properties
@@ -0,0 +1,98 @@
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ if TYPE_CHECKING:
6
+ from ..models.workflow_contents_nodes import WorkflowContentsNodes
7
+ from ..models.workflow_contents_output import WorkflowContentsOutput
8
+ from ..models.workflow_schema import WorkflowSchema
9
+
10
+
11
+ T = TypeVar("T", bound="WorkflowContents")
12
+
13
+
14
+ @attr.s(auto_attribs=True)
15
+ class WorkflowContents:
16
+ """
17
+ Attributes:
18
+ name (str):
19
+ nodes (WorkflowContentsNodes):
20
+ output (WorkflowContentsOutput):
21
+ schema (WorkflowSchema):
22
+ version (str):
23
+ """
24
+
25
+ name: str
26
+ nodes: "WorkflowContentsNodes"
27
+ output: "WorkflowContentsOutput"
28
+ schema: "WorkflowSchema"
29
+ version: str
30
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
31
+
32
+ def to_dict(self) -> Dict[str, Any]:
33
+ name = self.name
34
+ nodes = self.nodes.to_dict()
35
+
36
+ output = self.output.to_dict()
37
+
38
+ schema = self.schema.to_dict()
39
+
40
+ version = self.version
41
+
42
+ field_dict: Dict[str, Any] = {}
43
+ field_dict.update(self.additional_properties)
44
+ field_dict.update(
45
+ {
46
+ "name": name,
47
+ "nodes": nodes,
48
+ "output": output,
49
+ "schema": schema,
50
+ "version": version,
51
+ }
52
+ )
53
+
54
+ return field_dict
55
+
56
+ @classmethod
57
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
58
+ from ..models.workflow_contents_nodes import WorkflowContentsNodes
59
+ from ..models.workflow_contents_output import WorkflowContentsOutput
60
+ from ..models.workflow_schema import WorkflowSchema
61
+
62
+ d = src_dict.copy()
63
+ name = d.pop("name")
64
+
65
+ nodes = WorkflowContentsNodes.from_dict(d.pop("nodes"))
66
+
67
+ output = WorkflowContentsOutput.from_dict(d.pop("output"))
68
+
69
+ schema = WorkflowSchema.from_dict(d.pop("schema"))
70
+
71
+ version = d.pop("version")
72
+
73
+ workflow_contents = cls(
74
+ name=name,
75
+ nodes=nodes,
76
+ output=output,
77
+ schema=schema,
78
+ version=version,
79
+ )
80
+
81
+ workflow_contents.additional_properties = d
82
+ return workflow_contents
83
+
84
+ @property
85
+ def additional_keys(self) -> List[str]:
86
+ return list(self.additional_properties.keys())
87
+
88
+ def __getitem__(self, key: str) -> Any:
89
+ return self.additional_properties[key]
90
+
91
+ def __setitem__(self, key: str, value: Any) -> None:
92
+ self.additional_properties[key] = value
93
+
94
+ def __delitem__(self, key: str) -> None:
95
+ del self.additional_properties[key]
96
+
97
+ def __contains__(self, key: str) -> bool:
98
+ return key in self.additional_properties
@@ -0,0 +1,59 @@
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ if TYPE_CHECKING:
6
+ from ..models.workflow_node import WorkflowNode
7
+
8
+
9
+ T = TypeVar("T", bound="WorkflowContentsNodes")
10
+
11
+
12
+ @attr.s(auto_attribs=True)
13
+ class WorkflowContentsNodes:
14
+ """ """
15
+
16
+ additional_properties: Dict[str, "WorkflowNode"] = attr.ib(init=False, factory=dict)
17
+
18
+ def to_dict(self) -> Dict[str, Any]:
19
+ pass
20
+
21
+ field_dict: Dict[str, Any] = {}
22
+ for prop_name, prop in self.additional_properties.items():
23
+ field_dict[prop_name] = prop.to_dict()
24
+
25
+ field_dict.update({})
26
+
27
+ return field_dict
28
+
29
+ @classmethod
30
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
31
+ from ..models.workflow_node import WorkflowNode
32
+
33
+ d = src_dict.copy()
34
+ workflow_contents_nodes = cls()
35
+
36
+ additional_properties = {}
37
+ for prop_name, prop_dict in d.items():
38
+ additional_property = WorkflowNode.from_dict(prop_dict)
39
+
40
+ additional_properties[prop_name] = additional_property
41
+
42
+ workflow_contents_nodes.additional_properties = additional_properties
43
+ return workflow_contents_nodes
44
+
45
+ @property
46
+ def additional_keys(self) -> List[str]:
47
+ return list(self.additional_properties.keys())
48
+
49
+ def __getitem__(self, key: str) -> "WorkflowNode":
50
+ return self.additional_properties[key]
51
+
52
+ def __setitem__(self, key: str, value: "WorkflowNode") -> None:
53
+ self.additional_properties[key] = value
54
+
55
+ def __delitem__(self, key: str) -> None:
56
+ del self.additional_properties[key]
57
+
58
+ def __contains__(self, key: str) -> bool:
59
+ return key in self.additional_properties
@@ -0,0 +1,44 @@
1
+ from typing import Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ T = TypeVar("T", bound="WorkflowContentsOutput")
6
+
7
+
8
+ @attr.s(auto_attribs=True)
9
+ class WorkflowContentsOutput:
10
+ """ """
11
+
12
+ additional_properties: Dict[str, str] = attr.ib(init=False, factory=dict)
13
+
14
+ def to_dict(self) -> Dict[str, Any]:
15
+
16
+ field_dict: Dict[str, Any] = {}
17
+ field_dict.update(self.additional_properties)
18
+ field_dict.update({})
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
24
+ d = src_dict.copy()
25
+ workflow_contents_output = cls()
26
+
27
+ workflow_contents_output.additional_properties = d
28
+ return workflow_contents_output
29
+
30
+ @property
31
+ def additional_keys(self) -> List[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> str:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: str) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,149 @@
1
+ import datetime
2
+ from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union, cast
3
+
4
+ import attr
5
+ from dateutil.parser import isoparse
6
+
7
+ from ..types import UNSET, Unset
8
+
9
+ if TYPE_CHECKING:
10
+ from ..models.workflow_detail_contents_type_0 import WorkflowDetailContentsType0
11
+
12
+
13
+ T = TypeVar("T", bound="WorkflowDetail")
14
+
15
+
16
+ @attr.s(auto_attribs=True)
17
+ class WorkflowDetail:
18
+ """
19
+ Attributes:
20
+ name (str):
21
+ title (str):
22
+ is_public (bool):
23
+ user_id (str):
24
+ created_at (datetime.datetime):
25
+ contents (Union['WorkflowDetailContentsType0', List[Any], Unset, bool, float, int, str]):
26
+ """
27
+
28
+ name: str
29
+ title: str
30
+ is_public: bool
31
+ user_id: str
32
+ created_at: datetime.datetime
33
+ contents: Union["WorkflowDetailContentsType0", List[Any], Unset, bool, float, int, str] = UNSET
34
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
35
+
36
+ def to_dict(self) -> Dict[str, Any]:
37
+ from ..models.workflow_detail_contents_type_0 import WorkflowDetailContentsType0
38
+
39
+ name = self.name
40
+ title = self.title
41
+ is_public = self.is_public
42
+ user_id = self.user_id
43
+ created_at = self.created_at.isoformat()
44
+
45
+ contents: Union[Dict[str, Any], List[Any], Unset, bool, float, int, str]
46
+ if isinstance(self.contents, Unset):
47
+ contents = UNSET
48
+
49
+ elif isinstance(self.contents, WorkflowDetailContentsType0):
50
+ contents = UNSET
51
+ if not isinstance(self.contents, Unset):
52
+ contents = self.contents.to_dict()
53
+
54
+ elif isinstance(self.contents, list):
55
+ contents = UNSET
56
+ if not isinstance(self.contents, Unset):
57
+ contents = self.contents
58
+
59
+ else:
60
+ contents = self.contents
61
+
62
+ field_dict: Dict[str, Any] = {}
63
+ field_dict.update(self.additional_properties)
64
+ field_dict.update(
65
+ {
66
+ "name": name,
67
+ "title": title,
68
+ "is_public": is_public,
69
+ "user_id": user_id,
70
+ "created_at": created_at,
71
+ }
72
+ )
73
+ if contents is not UNSET:
74
+ field_dict["contents"] = contents
75
+
76
+ return field_dict
77
+
78
+ @classmethod
79
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
80
+ from ..models.workflow_detail_contents_type_0 import WorkflowDetailContentsType0
81
+
82
+ d = src_dict.copy()
83
+ name = d.pop("name")
84
+
85
+ title = d.pop("title")
86
+
87
+ is_public = d.pop("is_public")
88
+
89
+ user_id = d.pop("user_id")
90
+
91
+ created_at = isoparse(d.pop("created_at"))
92
+
93
+ def _parse_contents(
94
+ data: object,
95
+ ) -> Union["WorkflowDetailContentsType0", List[Any], Unset, bool, float, int, str]:
96
+ if isinstance(data, Unset):
97
+ return data
98
+ try:
99
+ if not isinstance(data, dict):
100
+ raise TypeError()
101
+ _contents_type_0 = data
102
+ contents_type_0: Union[Unset, WorkflowDetailContentsType0]
103
+ if isinstance(_contents_type_0, Unset):
104
+ contents_type_0 = UNSET
105
+ else:
106
+ contents_type_0 = WorkflowDetailContentsType0.from_dict(_contents_type_0)
107
+
108
+ return contents_type_0
109
+ except: # noqa: E722
110
+ pass
111
+ try:
112
+ if not isinstance(data, list):
113
+ raise TypeError()
114
+ contents_type_1 = cast(List[Any], data)
115
+
116
+ return contents_type_1
117
+ except: # noqa: E722
118
+ pass
119
+ return cast(Union["WorkflowDetailContentsType0", List[Any], Unset, bool, float, int, str], data)
120
+
121
+ contents = _parse_contents(d.pop("contents", UNSET))
122
+
123
+ workflow_detail = cls(
124
+ name=name,
125
+ title=title,
126
+ is_public=is_public,
127
+ user_id=user_id,
128
+ created_at=created_at,
129
+ contents=contents,
130
+ )
131
+
132
+ workflow_detail.additional_properties = d
133
+ return workflow_detail
134
+
135
+ @property
136
+ def additional_keys(self) -> List[str]:
137
+ return list(self.additional_properties.keys())
138
+
139
+ def __getitem__(self, key: str) -> Any:
140
+ return self.additional_properties[key]
141
+
142
+ def __setitem__(self, key: str, value: Any) -> None:
143
+ self.additional_properties[key] = value
144
+
145
+ def __delitem__(self, key: str) -> None:
146
+ del self.additional_properties[key]
147
+
148
+ def __contains__(self, key: str) -> bool:
149
+ return key in self.additional_properties
@@ -0,0 +1,44 @@
1
+ from typing import Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ T = TypeVar("T", bound="WorkflowDetailContentsType0")
6
+
7
+
8
+ @attr.s(auto_attribs=True)
9
+ class WorkflowDetailContentsType0:
10
+ """ """
11
+
12
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
13
+
14
+ def to_dict(self) -> Dict[str, Any]:
15
+
16
+ field_dict: Dict[str, Any] = {}
17
+ field_dict.update(self.additional_properties)
18
+ field_dict.update({})
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
24
+ d = src_dict.copy()
25
+ workflow_detail_contents_type_0 = cls()
26
+
27
+ workflow_detail_contents_type_0.additional_properties = d
28
+ return workflow_detail_contents_type_0
29
+
30
+ @property
31
+ def additional_keys(self) -> List[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> Any:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: Any) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,80 @@
1
+ import datetime
2
+ from typing import Any, Dict, List, Type, TypeVar
3
+
4
+ import attr
5
+ from dateutil.parser import isoparse
6
+
7
+ T = TypeVar("T", bound="WorkflowItem")
8
+
9
+
10
+ @attr.s(auto_attribs=True)
11
+ class WorkflowItem:
12
+ """
13
+ Attributes:
14
+ name (str):
15
+ title (str):
16
+ user_id (str):
17
+ created_at (datetime.datetime):
18
+ """
19
+
20
+ name: str
21
+ title: str
22
+ user_id: str
23
+ created_at: datetime.datetime
24
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
25
+
26
+ def to_dict(self) -> Dict[str, Any]:
27
+ name = self.name
28
+ title = self.title
29
+ user_id = self.user_id
30
+ created_at = self.created_at.isoformat()
31
+
32
+ field_dict: Dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update(
35
+ {
36
+ "name": name,
37
+ "title": title,
38
+ "user_id": user_id,
39
+ "created_at": created_at,
40
+ }
41
+ )
42
+
43
+ return field_dict
44
+
45
+ @classmethod
46
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
47
+ d = src_dict.copy()
48
+ name = d.pop("name")
49
+
50
+ title = d.pop("title")
51
+
52
+ user_id = d.pop("user_id")
53
+
54
+ created_at = isoparse(d.pop("created_at"))
55
+
56
+ workflow_item = cls(
57
+ name=name,
58
+ title=title,
59
+ user_id=user_id,
60
+ created_at=created_at,
61
+ )
62
+
63
+ workflow_item.additional_properties = d
64
+ return workflow_item
65
+
66
+ @property
67
+ def additional_keys(self) -> List[str]:
68
+ return list(self.additional_properties.keys())
69
+
70
+ def __getitem__(self, key: str) -> Any:
71
+ return self.additional_properties[key]
72
+
73
+ def __setitem__(self, key: str, value: Any) -> None:
74
+ self.additional_properties[key] = value
75
+
76
+ def __delitem__(self, key: str) -> None:
77
+ del self.additional_properties[key]
78
+
79
+ def __contains__(self, key: str) -> bool:
80
+ return key in self.additional_properties