syllable-sdk 0.44.17__py3-none-any.whl → 0.44.20__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.
syllable_sdk/_version.py CHANGED
@@ -3,10 +3,10 @@
3
3
  import importlib.metadata
4
4
 
5
5
  __title__: str = "syllable-sdk"
6
- __version__: str = "0.44.17"
6
+ __version__: str = "0.44.20"
7
7
  __openapi_doc_version__: str = "0.0.3"
8
- __gen_version__: str = "2.791.1"
9
- __user_agent__: str = "speakeasy-sdk/python 0.44.17 2.791.1 0.0.3 syllable-sdk"
8
+ __gen_version__: str = "2.794.1"
9
+ __user_agent__: str = "speakeasy-sdk/python 0.44.20 2.794.1 0.0.3 syllable-sdk"
10
10
 
11
11
  try:
12
12
  if __package__ is not None:
@@ -42,7 +42,6 @@ if TYPE_CHECKING:
42
42
  validate_decimal,
43
43
  validate_float,
44
44
  validate_int,
45
- validate_open_enum,
46
45
  )
47
46
  from .url import generate_url, template_url, remove_suffix
48
47
  from .values import (
@@ -104,7 +103,6 @@ __all__ = [
104
103
  "validate_const",
105
104
  "validate_float",
106
105
  "validate_int",
107
- "validate_open_enum",
108
106
  "cast_partial",
109
107
  ]
110
108
 
@@ -158,7 +156,6 @@ _dynamic_imports: dict[str, str] = {
158
156
  "validate_const": ".serializers",
159
157
  "validate_float": ".serializers",
160
158
  "validate_int": ".serializers",
161
- "validate_open_enum": ".serializers",
162
159
  "cast_partial": ".values",
163
160
  }
164
161
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  import enum
4
4
  import sys
5
+ from typing import Any
6
+
7
+ from pydantic_core import core_schema
8
+
5
9
 
6
10
  class OpenEnumMeta(enum.EnumMeta):
7
11
  # The __call__ method `boundary` kwarg was added in 3.11 and must be present
@@ -72,3 +76,59 @@ class OpenEnumMeta(enum.EnumMeta):
72
76
  )
73
77
  except ValueError:
74
78
  return value
79
+
80
+ def __new__(mcs, name, bases, namespace, **kwargs):
81
+ cls = super().__new__(mcs, name, bases, namespace, **kwargs)
82
+
83
+ # Add __get_pydantic_core_schema__ to make open enums work correctly
84
+ # in union discrimination. In strict mode (used by Pydantic for unions),
85
+ # only known enum values match. In lax mode, unknown values are accepted.
86
+ def __get_pydantic_core_schema__(
87
+ cls_inner: Any, _source_type: Any, _handler: Any
88
+ ) -> core_schema.CoreSchema:
89
+ # Create a validator that only accepts known enum values (for strict mode)
90
+ def validate_strict(v: Any) -> Any:
91
+ if isinstance(v, cls_inner):
92
+ return v
93
+ # Use the parent EnumMeta's __call__ which raises ValueError for unknown values
94
+ return enum.EnumMeta.__call__(cls_inner, v)
95
+
96
+ # Create a lax validator that accepts unknown values
97
+ def validate_lax(v: Any) -> Any:
98
+ if isinstance(v, cls_inner):
99
+ return v
100
+ try:
101
+ return enum.EnumMeta.__call__(cls_inner, v)
102
+ except ValueError:
103
+ # Return the raw value for unknown enum values
104
+ return v
105
+
106
+ # Determine the base type schema (str or int)
107
+ is_int_enum = False
108
+ for base in cls_inner.__mro__:
109
+ if base is int:
110
+ is_int_enum = True
111
+ break
112
+ if base is str:
113
+ break
114
+
115
+ base_schema = (
116
+ core_schema.int_schema()
117
+ if is_int_enum
118
+ else core_schema.str_schema()
119
+ )
120
+
121
+ # Use lax_or_strict_schema:
122
+ # - strict mode: only known enum values match (raises ValueError for unknown)
123
+ # - lax mode: accept any value, return enum member or raw value
124
+ return core_schema.lax_or_strict_schema(
125
+ lax_schema=core_schema.chain_schema(
126
+ [base_schema, core_schema.no_info_plain_validator_function(validate_lax)]
127
+ ),
128
+ strict_schema=core_schema.chain_schema(
129
+ [base_schema, core_schema.no_info_plain_validator_function(validate_strict)]
130
+ ),
131
+ )
132
+
133
+ setattr(cls, "__get_pydantic_core_schema__", classmethod(__get_pydantic_core_schema__))
134
+ return cls
@@ -44,15 +44,15 @@ def serialize_request_body(
44
44
 
45
45
  serialized_request_body = SerializedRequestBody(media_type)
46
46
 
47
- if re.match(r"(application|text)\/.*?\+*json.*", media_type) is not None:
47
+ if re.match(r"^(application|text)\/([^+]+\+)*json.*", media_type) is not None:
48
48
  serialized_request_body.content = marshal_json(request_body, request_body_type)
49
- elif re.match(r"multipart\/.*", media_type) is not None:
49
+ elif re.match(r"^multipart\/.*", media_type) is not None:
50
50
  (
51
51
  serialized_request_body.media_type,
52
52
  serialized_request_body.data,
53
53
  serialized_request_body.files,
54
54
  ) = serialize_multipart_form(media_type, request_body)
55
- elif re.match(r"application\/x-www-form-urlencoded.*", media_type) is not None:
55
+ elif re.match(r"^application\/x-www-form-urlencoded.*", media_type) is not None:
56
56
  serialized_request_body.data = serialize_form_data(request_body)
57
57
  elif isinstance(request_body, (bytes, bytearray, io.BytesIO, io.BufferedReader)):
58
58
  serialized_request_body.content = request_body
@@ -102,26 +102,6 @@ def validate_int(b):
102
102
  return int(b)
103
103
 
104
104
 
105
- def validate_open_enum(is_int: bool):
106
- def validate(e):
107
- if e is None:
108
- return None
109
-
110
- if isinstance(e, Unset):
111
- return e
112
-
113
- if is_int:
114
- if not isinstance(e, int):
115
- raise ValueError("Expected int")
116
- else:
117
- if not isinstance(e, str):
118
- raise ValueError("Expected string")
119
-
120
- return e
121
-
122
- return validate
123
-
124
-
125
105
  def validate_const(v):
126
106
  def validate(c):
127
107
  # Optional[T] is a Union[T, None]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: syllable-sdk
3
- Version: 0.44.17
3
+ Version: 0.44.20
4
4
  Summary: Python Client SDK Generated by Speakeasy.
5
5
  Author: Syllable
6
6
  Requires-Python: >=3.9.2
@@ -3,7 +3,7 @@ syllable_sdk/_hooks/__init__.py,sha256=9_7W5jAYw8rcO8Kfc-Ty-lB82BHfksAJJpVFb_UeU
3
3
  syllable_sdk/_hooks/registration.py,sha256=1QZB41w6If7I9dXiOSQx6dhSc6BPWrnI5Q5bMOr4iVA,624
4
4
  syllable_sdk/_hooks/sdkhooks.py,sha256=aRu2TMpxilLKDrG6EIy6uQd6IrBH7kaHOoVkd7GIcus,2562
5
5
  syllable_sdk/_hooks/types.py,sha256=uwJkn18g4_rLZhVtKdE6Ed5YcCjGWSqVgN9-PWqV7Ho,3053
6
- syllable_sdk/_version.py,sha256=JkjatalrwvzwkBJWkwtHEcjvVvQS-tS4oRwCKq_pWuE,470
6
+ syllable_sdk/_version.py,sha256=dSc0yPYX4SClXU72FVKHgaWw4CWMM6Sc9qcazJRWonQ,470
7
7
  syllable_sdk/agents.py,sha256=5X4d7rstMwWCUTmNH76eX3dTFLGvUtO5fb36hYtXo9w,47252
8
8
  syllable_sdk/basesdk.py,sha256=OZv9Uydmc41Bm5rsLYX8yZdHFZxLCS8f0lABAZkQNs0,12473
9
9
  syllable_sdk/batches.py,sha256=jAL-2jfZqhuVGWd6gG7hzPk7mG_X1M1AuLsO14QRzM8,73743
@@ -420,26 +420,26 @@ syllable_sdk/twilio.py,sha256=suZO3rlKl-mBqqF68EzqwJ2WcSfH0qwRzP1DQUCZdNc,24300
420
420
  syllable_sdk/types/__init__.py,sha256=RArOwSgeeTIva6h-4ttjXwMUeCkz10nAFBL9D-QljI4,377
421
421
  syllable_sdk/types/basemodel.py,sha256=MULDVywSVxR0lo8h5wMnXnkBFXLK5DXmBKD1eXAVKgE,2879
422
422
  syllable_sdk/users.py,sha256=jm_1MGY6X5_3GL9c15F3_E_YaA_A-fzlBS3heKssX74,53983
423
- syllable_sdk/utils/__init__.py,sha256=CAG0O76aEToGKXpT6Ft87Vd-iiQTh4XdBrQ37BVbsiM,5861
423
+ syllable_sdk/utils/__init__.py,sha256=rIeddnHALPXhBP408MS8XDH7kO53V3kiXv25yTOv2UY,5765
424
424
  syllable_sdk/utils/annotations.py,sha256=FvfvVTUj8TUclm4HbGgY5yi2Ap7EzGmu2UPFU4FwC1w,2755
425
425
  syllable_sdk/utils/datetimes.py,sha256=oppAA5e3V35pQov1-FNLKxAaNF1_XWi-bQtyjjql3H8,855
426
- syllable_sdk/utils/enums.py,sha256=REU6ydF8gsVL3xaeGX4sMNyiL3q5P9h29-f6Sa6luAE,2633
426
+ syllable_sdk/utils/enums.py,sha256=wAgjjw7USk6IRpN2UJE5Sl8rfmEFiRwyrwMhhznnDIc,5147
427
427
  syllable_sdk/utils/eventstreaming.py,sha256=SgFqMcUOYKlrTQ4gAp_dNcKLvDXukeiEMNU3DP8mXk8,6692
428
428
  syllable_sdk/utils/forms.py,sha256=HzltKnYH5-ULoEz8JYfIUcw13I9dMZjw-1lQKNkH5fw,7178
429
429
  syllable_sdk/utils/headers.py,sha256=cPxWSmUILrefTGDzTH1Hdj7_Hlsj-EY6K5Tyc4iH4dk,3663
430
430
  syllable_sdk/utils/logger.py,sha256=nPc714a9tLm0QMEvK0KYGr2Sko2xjbqq-tPnNGLpFIE,682
431
431
  syllable_sdk/utils/metadata.py,sha256=Per2KFXXOqOtoUWXrlIfjrSrBg199KrRW0nKQDgHIBU,3136
432
432
  syllable_sdk/utils/queryparams.py,sha256=dxtFQDJ8dlbm_hh_fhdFC1qMWOOHR2MszNycKmME8bQ,6326
433
- syllable_sdk/utils/requestbodies.py,sha256=ySjEyjcLi731LNUahWvLOrES2HihuA8VrOJx4eQ7Qzg,2101
433
+ syllable_sdk/utils/requestbodies.py,sha256=7bi6slrGKAbmfg4BoOUjSVGrbg9NvIFvCKUEgjwyJEw,2108
434
434
  syllable_sdk/utils/retries.py,sha256=stPJEFtmK8gOM6aT0DpEJp9Z39oXX1-8I69jpa2n3Ww,8130
435
435
  syllable_sdk/utils/security.py,sha256=ISsENQVLMQAPDsJ09g-m67Bs9YaS1-H-Hhw89RBJA3E,6037
436
- syllable_sdk/utils/serializers.py,sha256=Hndks5M_rJXVub_N5lu0gKZQUoEmWrn6PN7R-0HwvOE,5999
436
+ syllable_sdk/utils/serializers.py,sha256=ueUga5yv_08r10eQiaVIk0o726j0TRno8603jUksasA,5585
437
437
  syllable_sdk/utils/unmarshal_json_response.py,sha256=DwB7Hxdo9JjWFMqsxsTznV6d_MIlLLLz-tq04at_X9s,877
438
438
  syllable_sdk/utils/url.py,sha256=BgGPgcTA6MRK4bF8fjP2dUopN3NzEzxWMXPBVg8NQUA,5254
439
439
  syllable_sdk/utils/values.py,sha256=CcaCXEa3xHhkUDROyXZocN8f0bdITftv9Y0P9lTf0YM,3517
440
440
  syllable_sdk/v1.py,sha256=dA67n3aRVr-3VqqW4sFcIAqPRpEwsQqStv9EfJ-EPCc,53980
441
441
  syllable_sdk/voice_groups.py,sha256=ChjGJJW1n7IHfiSenzi-HiIa51jHFjUAO5L5yzNMPFY,48944
442
442
  syllable_sdk/workflows.py,sha256=vXaEaw29tOeMqUIBiJqN9S2XW4B3NP_ZDoUPMVDh_Ck,65385
443
- syllable_sdk-0.44.17.dist-info/METADATA,sha256=Kx5qOHe_5_N5XvXFrYs72cQ6a1_xTfWhlZwnSRbvdFg,50234
444
- syllable_sdk-0.44.17.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
445
- syllable_sdk-0.44.17.dist-info/RECORD,,
443
+ syllable_sdk-0.44.20.dist-info/METADATA,sha256=SW4EMalgyOdf3RJOT_0pQ7zYY6nPWIA1Yc9A0HGq8_g,50234
444
+ syllable_sdk-0.44.20.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
445
+ syllable_sdk-0.44.20.dist-info/RECORD,,