optimizely-opal.opal-tools-sdk 0.1.6.dev0__py3-none-any.whl → 0.1.10.dev0__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.
- opal_tools_sdk/decorators.py +29 -6
- opal_tools_sdk/models.py +5 -2
- {optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info → optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info}/METADATA +3 -1
- optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info/RECORD +11 -0
- optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info/RECORD +0 -11
- {optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info → optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info}/WHEEL +0 -0
- {optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info → optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info}/top_level.txt +0 -0
opal_tools_sdk/decorators.py
CHANGED
|
@@ -62,25 +62,48 @@ def tool(name: str, description: str, auth_requirements: Optional[List[Dict[str,
|
|
|
62
62
|
else:
|
|
63
63
|
field_type = str
|
|
64
64
|
|
|
65
|
+
# Check if the field is Optional (Union with None)
|
|
66
|
+
# Optional[X] is equivalent to Union[X, None]
|
|
67
|
+
type_args = getattr(field_type, '__args__', ())
|
|
68
|
+
is_optional = get_origin(field_type) is Union and type(None) in type_args
|
|
69
|
+
|
|
70
|
+
# Extract the actual type from Optional[T]
|
|
71
|
+
if is_optional and type_args:
|
|
72
|
+
# Get the non-None type from Union[T, None]
|
|
73
|
+
field_type = next(
|
|
74
|
+
(arg for arg in type_args if arg is not type(None)),
|
|
75
|
+
field_type,
|
|
76
|
+
)
|
|
77
|
+
|
|
65
78
|
# Map Python type to Parameter type
|
|
66
79
|
param_type = ParameterType.string
|
|
67
|
-
if field_type
|
|
80
|
+
if field_type is int:
|
|
68
81
|
param_type = ParameterType.integer
|
|
69
|
-
elif field_type
|
|
82
|
+
elif field_type is float:
|
|
70
83
|
param_type = ParameterType.number
|
|
71
|
-
elif field_type
|
|
84
|
+
elif field_type is bool:
|
|
72
85
|
param_type = ParameterType.boolean
|
|
73
|
-
elif get_origin(field_type) is list:
|
|
86
|
+
elif field_type is list or get_origin(field_type) is list:
|
|
74
87
|
param_type = ParameterType.list
|
|
75
|
-
elif get_origin(field_type) is dict:
|
|
88
|
+
elif field_type is dict or get_origin(field_type) is dict:
|
|
76
89
|
param_type = ParameterType.dictionary
|
|
77
90
|
|
|
78
91
|
# Determine if required
|
|
79
92
|
field_info_extra = getattr(field_info, "json_schema_extra") or {}
|
|
80
93
|
if "required" in field_info_extra:
|
|
81
94
|
required = field_info_extra["required"]
|
|
95
|
+
# If the field is typed as Optional, it's not required (check this FIRST)
|
|
96
|
+
elif is_optional:
|
|
97
|
+
required = False
|
|
98
|
+
# Check for Pydantic v2 is_required() method
|
|
99
|
+
elif hasattr(field_info, 'is_required'):
|
|
100
|
+
required = field_info.is_required()
|
|
101
|
+
# Fall back to checking if default is ... (Pydantic v1/v2 compatibility)
|
|
102
|
+
elif hasattr(field_info, 'default'):
|
|
103
|
+
required = field_info.default is ...
|
|
82
104
|
else:
|
|
83
|
-
|
|
105
|
+
# If no default attribute at all, assume required
|
|
106
|
+
required = True
|
|
84
107
|
|
|
85
108
|
# Get description
|
|
86
109
|
description_text = ""
|
opal_tools_sdk/models.py
CHANGED
|
@@ -112,6 +112,8 @@ class IslandConfig(BaseModel):
|
|
|
112
112
|
|
|
113
113
|
fields: list[Field]
|
|
114
114
|
actions: list[Action]
|
|
115
|
+
type: Optional[str] = None
|
|
116
|
+
icon: Optional[str] = None
|
|
115
117
|
|
|
116
118
|
|
|
117
119
|
class IslandResponse(BaseModel):
|
|
@@ -120,7 +122,8 @@ class IslandResponse(BaseModel):
|
|
|
120
122
|
|
|
121
123
|
type: Literal["island"]
|
|
122
124
|
config: ResponseConfig
|
|
125
|
+
message: Optional[str] = None
|
|
123
126
|
|
|
124
127
|
@classmethod
|
|
125
|
-
def create(cls, islands: list[IslandConfig]):
|
|
126
|
-
return cls(type="island", config=cls.ResponseConfig(islands=islands))
|
|
128
|
+
def create(cls, islands: list[IslandConfig], message: Optional[str] = None):
|
|
129
|
+
return cls(type="island", config=cls.ResponseConfig(islands=islands), message=message)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: optimizely-opal.opal-tools-sdk
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10.dev0
|
|
4
4
|
Summary: SDK for creating Opal-compatible tools services
|
|
5
5
|
Home-page: https://github.com/optimizely/opal-tools-sdk
|
|
6
6
|
Author: Optimizely
|
|
@@ -223,6 +223,8 @@ Actions represent buttons or operations:
|
|
|
223
223
|
Contains the complete island configuration:
|
|
224
224
|
- `fields`: List of IslandConfig.Field objects
|
|
225
225
|
- `actions`: List of IslandConfig.Action objects
|
|
226
|
+
- `type`: Island type for UI rendering (optional, default: `None`)
|
|
227
|
+
- `icon`: Icon to display in the island (optional, default: `None`)
|
|
226
228
|
|
|
227
229
|
#### IslandResponse
|
|
228
230
|
The response wrapper for islands:
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
opal_tools_sdk/__init__.py,sha256=0B0c53fyCRMuI_zOfwiePzQk5ion1BSKCqGLVsY0TVk,495
|
|
2
|
+
opal_tools_sdk/_registry.py,sha256=YE3eD4kcS09QDe4RccBYAzXPo9znEU7fblrsB-g3o-Y,67
|
|
3
|
+
opal_tools_sdk/auth.py,sha256=9aMiZv6n6_iu7hQA0sKg4hgNr5DzYFFuP0SWUoZf_Vw,1520
|
|
4
|
+
opal_tools_sdk/decorators.py,sha256=DuSDb1Dd1DSIlOC0ZBS4iE8Go3O93xqtPS43S5HwKBw,6526
|
|
5
|
+
opal_tools_sdk/logging.py,sha256=krvkhdql2GWh0aCWj5gfqyn5plsyLJ773WzIirK7tkU,1325
|
|
6
|
+
opal_tools_sdk/models.py,sha256=X25qtorUkQKQAd2zHBJjlBSGeIo0gIJVJ7d0QJsPPko,3546
|
|
7
|
+
opal_tools_sdk/service.py,sha256=a5ZC-J1GF5y1-FdWCXdilCy7p5hG63MTTn6frBBCo4Y,6939
|
|
8
|
+
optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info/METADATA,sha256=AJEYAccTQUy-Tk9YgB_iZuJmp5LpqvCf0-ZkeiVPIBo,8221
|
|
9
|
+
optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
10
|
+
optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info/top_level.txt,sha256=nCJ5PxF0rgoV6yNJvvuUaZPx4D3EWkl7gpu-6xafH1E,15
|
|
11
|
+
optimizely_opal_opal_tools_sdk-0.1.10.dev0.dist-info/RECORD,,
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
opal_tools_sdk/__init__.py,sha256=0B0c53fyCRMuI_zOfwiePzQk5ion1BSKCqGLVsY0TVk,495
|
|
2
|
-
opal_tools_sdk/_registry.py,sha256=YE3eD4kcS09QDe4RccBYAzXPo9znEU7fblrsB-g3o-Y,67
|
|
3
|
-
opal_tools_sdk/auth.py,sha256=9aMiZv6n6_iu7hQA0sKg4hgNr5DzYFFuP0SWUoZf_Vw,1520
|
|
4
|
-
opal_tools_sdk/decorators.py,sha256=iHal7RElOSCWjqKHIK-Hc4GKOsjuGyUg0_lsQKVQShg,5315
|
|
5
|
-
opal_tools_sdk/logging.py,sha256=krvkhdql2GWh0aCWj5gfqyn5plsyLJ773WzIirK7tkU,1325
|
|
6
|
-
opal_tools_sdk/models.py,sha256=YESFXdIPIFoVqP6OXtswXzHQ1tYMFVSnb8rFVe9cFj4,3403
|
|
7
|
-
opal_tools_sdk/service.py,sha256=a5ZC-J1GF5y1-FdWCXdilCy7p5hG63MTTn6frBBCo4Y,6939
|
|
8
|
-
optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info/METADATA,sha256=dY_LreIH84jGIXPLzpdL3MSUnzn3L5b4fRRTfKd5jvM,8085
|
|
9
|
-
optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
10
|
-
optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info/top_level.txt,sha256=nCJ5PxF0rgoV6yNJvvuUaZPx4D3EWkl7gpu-6xafH1E,15
|
|
11
|
-
optimizely_opal_opal_tools_sdk-0.1.6.dev0.dist-info/RECORD,,
|
|
File without changes
|