dub 0.29.0__py3-none-any.whl → 0.29.2__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.
dub/_version.py CHANGED
@@ -3,10 +3,10 @@
3
3
  import importlib.metadata
4
4
 
5
5
  __title__: str = "dub"
6
- __version__: str = "0.29.0"
6
+ __version__: str = "0.29.2"
7
7
  __openapi_doc_version__: str = "0.0.1"
8
- __gen_version__: str = "2.698.0"
9
- __user_agent__: str = "speakeasy-sdk/python 0.29.0 2.698.0 0.0.1 dub"
8
+ __gen_version__: str = "2.698.4"
9
+ __user_agent__: str = "speakeasy-sdk/python 0.29.2 2.698.4 0.0.1 dub"
10
10
 
11
11
  try:
12
12
  if __package__ is not None:
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class BadRequestData(BaseModel):
39
40
  error: Error
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class BadRequest(DubError):
43
45
  r"""The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing)."""
44
46
 
45
- data: BadRequestData
47
+ data: BadRequestData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class BadRequest(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class ConflictData(BaseModel):
39
40
  error: ConflictError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class Conflict(DubError):
43
45
  r"""This response is sent when a request conflicts with the current state of the server."""
44
46
 
45
- data: ConflictData
47
+ data: ConflictData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class Conflict(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -2,25 +2,29 @@
2
2
 
3
3
  import httpx
4
4
  from typing import Optional
5
+ from dataclasses import dataclass, field
5
6
 
6
7
 
8
+ @dataclass(frozen=True)
7
9
  class DubError(Exception):
8
10
  """The base class for all HTTP error responses."""
9
11
 
10
12
  message: str
11
13
  status_code: int
12
14
  body: str
13
- headers: httpx.Headers
14
- raw_response: httpx.Response
15
+ headers: httpx.Headers = field(hash=False)
16
+ raw_response: httpx.Response = field(hash=False)
15
17
 
16
18
  def __init__(
17
19
  self, message: str, raw_response: httpx.Response, body: Optional[str] = None
18
20
  ):
19
- self.message = message
20
- self.status_code = raw_response.status_code
21
- self.body = body if body is not None else raw_response.text
22
- self.headers = raw_response.headers
23
- self.raw_response = raw_response
21
+ object.__setattr__(self, "message", message)
22
+ object.__setattr__(self, "status_code", raw_response.status_code)
23
+ object.__setattr__(
24
+ self, "body", body if body is not None else raw_response.text
25
+ )
26
+ object.__setattr__(self, "headers", raw_response.headers)
27
+ object.__setattr__(self, "raw_response", raw_response)
24
28
 
25
29
  def __str__(self):
26
30
  return self.message
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class ForbiddenData(BaseModel):
39
40
  error: ForbiddenError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class Forbidden(DubError):
43
45
  r"""The client does not have access rights to the content; that is, it is unauthorized, so the server is refusing to give the requested resource. Unlike 401 Unauthorized, the client's identity is known to the server."""
44
46
 
45
- data: ForbiddenData
47
+ data: ForbiddenData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class Forbidden(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class InternalServerErrorData(BaseModel):
39
40
  error: InternalServerErrorError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class InternalServerError(DubError):
43
45
  r"""The server has encountered a situation it does not know how to handle."""
44
46
 
45
- data: InternalServerErrorData
47
+ data: InternalServerErrorData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class InternalServerError(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class InviteExpiredData(BaseModel):
39
40
  error: InviteExpiredError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class InviteExpired(DubError):
43
45
  r"""This response is sent when the requested content has been permanently deleted from server, with no forwarding address."""
44
46
 
45
- data: InviteExpiredData
47
+ data: InviteExpiredData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class InviteExpired(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -1,12 +1,16 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
+ from dataclasses import dataclass
4
+
5
+
6
+ @dataclass(frozen=True)
3
7
  class NoResponseError(Exception):
4
8
  """Error raised when no HTTP response is received from the server."""
5
9
 
6
10
  message: str
7
11
 
8
12
  def __init__(self, message: str = "No response received"):
9
- self.message = message
13
+ object.__setattr__(self, "message", message)
10
14
  super().__init__(message)
11
15
 
12
16
  def __str__(self):
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class NotFoundData(BaseModel):
39
40
  error: NotFoundError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class NotFound(DubError):
43
45
  r"""The server cannot find the requested resource."""
44
46
 
45
- data: NotFoundData
47
+ data: NotFoundData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class NotFound(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class RateLimitExceededData(BaseModel):
39
40
  error: RateLimitExceededError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class RateLimitExceeded(DubError):
43
45
  r"""The user has sent too many requests in a given amount of time (\"rate limiting\")"""
44
46
 
45
- data: RateLimitExceededData
47
+ data: RateLimitExceededData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class RateLimitExceeded(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -2,10 +2,12 @@
2
2
 
3
3
  import httpx
4
4
  from typing import Optional
5
+ from dataclasses import dataclass
5
6
 
6
7
  from dub.models.errors import DubError
7
8
 
8
9
 
10
+ @dataclass(frozen=True)
9
11
  class ResponseValidationError(DubError):
10
12
  """Error raised when there is a type mismatch between the response data and the expected Pydantic model."""
11
13
 
@@ -2,12 +2,14 @@
2
2
 
3
3
  import httpx
4
4
  from typing import Optional
5
+ from dataclasses import dataclass
5
6
 
6
7
  from dub.models.errors import DubError
7
8
 
8
9
  MAX_MESSAGE_LEN = 10_000
9
10
 
10
11
 
12
+ @dataclass(frozen=True)
11
13
  class SDKError(DubError):
12
14
  """The fallback error class if no more specific error class is matched."""
13
15
 
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class UnauthorizedData(BaseModel):
39
40
  error: UnauthorizedError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class Unauthorized(DubError):
43
45
  r"""Although the HTTP standard specifies \"unauthorized\", semantically this response means \"unauthenticated\". That is, the client must authenticate itself to get the requested response."""
44
46
 
45
- data: UnauthorizedData
47
+ data: UnauthorizedData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class Unauthorized(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from dataclasses import dataclass, field
4
5
  from dub.models.errors import DubError
5
6
  from dub.types import BaseModel
6
7
  from enum import Enum
@@ -39,10 +40,11 @@ class UnprocessableEntityData(BaseModel):
39
40
  error: UnprocessableEntityError
40
41
 
41
42
 
43
+ @dataclass(frozen=True)
42
44
  class UnprocessableEntity(DubError):
43
45
  r"""The request was well-formed but was unable to be followed due to semantic errors."""
44
46
 
45
- data: UnprocessableEntityData
47
+ data: UnprocessableEntityData = field(hash=False)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -53,4 +55,4 @@ class UnprocessableEntity(DubError):
53
55
  fallback = body or raw_response.text
54
56
  message = str(data.error.message) or fallback
55
57
  super().__init__(message, raw_response, body)
56
- self.data = data
58
+ object.__setattr__(self, "data", data)
@@ -307,6 +307,8 @@ if TYPE_CHECKING:
307
307
  Customer,
308
308
  CustomerTypedDict,
309
309
  Mode,
310
+ TrackLeadLink,
311
+ TrackLeadLinkTypedDict,
310
312
  TrackLeadRequestBody,
311
313
  TrackLeadRequestBodyTypedDict,
312
314
  TrackLeadResponseBody,
@@ -668,6 +670,8 @@ __all__ = [
668
670
  "TestVariants",
669
671
  "TestVariantsTypedDict",
670
672
  "Three",
673
+ "TrackLeadLink",
674
+ "TrackLeadLinkTypedDict",
671
675
  "TrackLeadRequestBody",
672
676
  "TrackLeadRequestBodyTypedDict",
673
677
  "TrackLeadResponseBody",
@@ -1007,6 +1011,8 @@ _dynamic_imports: dict[str, str] = {
1007
1011
  "Customer": ".tracklead",
1008
1012
  "CustomerTypedDict": ".tracklead",
1009
1013
  "Mode": ".tracklead",
1014
+ "TrackLeadLink": ".tracklead",
1015
+ "TrackLeadLinkTypedDict": ".tracklead",
1010
1016
  "TrackLeadRequestBody": ".tracklead",
1011
1017
  "TrackLeadRequestBodyTypedDict": ".tracklead",
1012
1018
  "TrackLeadResponseBody": ".tracklead",
@@ -126,6 +126,86 @@ class Click(BaseModel):
126
126
  id: str
127
127
 
128
128
 
129
+ class TrackLeadLinkTypedDict(TypedDict):
130
+ id: str
131
+ r"""The unique ID of the short link."""
132
+ domain: str
133
+ r"""The domain of the short link. If not provided, the primary domain for the workspace will be used (or `dub.sh` if the workspace has no domains)."""
134
+ key: str
135
+ r"""The short link slug. If not provided, a random 7-character slug will be generated."""
136
+ short_link: str
137
+ r"""The full URL of the short link, including the https protocol (e.g. `https://dub.sh/try`)."""
138
+ url: str
139
+ r"""The destination URL of the short link."""
140
+ partner_id: Nullable[str]
141
+ r"""The ID of the partner the short link is associated with."""
142
+ program_id: Nullable[str]
143
+ r"""The ID of the program the short link is associated with."""
144
+ tenant_id: Nullable[str]
145
+ r"""The ID of the tenant that created the link inside your system. If set, it can be used to fetch all links for a tenant."""
146
+ external_id: Nullable[str]
147
+ r"""The ID of the link in your database. If set, it can be used to identify the link in future API requests (must be prefixed with 'ext_' when passed as a query parameter). This key is unique across your workspace."""
148
+
149
+
150
+ class TrackLeadLink(BaseModel):
151
+ id: str
152
+ r"""The unique ID of the short link."""
153
+
154
+ domain: str
155
+ r"""The domain of the short link. If not provided, the primary domain for the workspace will be used (or `dub.sh` if the workspace has no domains)."""
156
+
157
+ key: str
158
+ r"""The short link slug. If not provided, a random 7-character slug will be generated."""
159
+
160
+ short_link: Annotated[str, pydantic.Field(alias="shortLink")]
161
+ r"""The full URL of the short link, including the https protocol (e.g. `https://dub.sh/try`)."""
162
+
163
+ url: str
164
+ r"""The destination URL of the short link."""
165
+
166
+ partner_id: Annotated[Nullable[str], pydantic.Field(alias="partnerId")]
167
+ r"""The ID of the partner the short link is associated with."""
168
+
169
+ program_id: Annotated[Nullable[str], pydantic.Field(alias="programId")]
170
+ r"""The ID of the program the short link is associated with."""
171
+
172
+ tenant_id: Annotated[Nullable[str], pydantic.Field(alias="tenantId")]
173
+ r"""The ID of the tenant that created the link inside your system. If set, it can be used to fetch all links for a tenant."""
174
+
175
+ external_id: Annotated[Nullable[str], pydantic.Field(alias="externalId")]
176
+ r"""The ID of the link in your database. If set, it can be used to identify the link in future API requests (must be prefixed with 'ext_' when passed as a query parameter). This key is unique across your workspace."""
177
+
178
+ @model_serializer(mode="wrap")
179
+ def serialize_model(self, handler):
180
+ optional_fields = []
181
+ nullable_fields = ["partnerId", "programId", "tenantId", "externalId"]
182
+ null_default_fields = []
183
+
184
+ serialized = handler(self)
185
+
186
+ m = {}
187
+
188
+ for n, f in type(self).model_fields.items():
189
+ k = f.alias or n
190
+ val = serialized.get(k)
191
+ serialized.pop(k, None)
192
+
193
+ optional_nullable = k in optional_fields and k in nullable_fields
194
+ is_set = (
195
+ self.__pydantic_fields_set__.intersection({n})
196
+ or k in null_default_fields
197
+ ) # pylint: disable=no-member
198
+
199
+ if val is not None and val != UNSET_SENTINEL:
200
+ m[k] = val
201
+ elif val != UNSET_SENTINEL and (
202
+ not k in optional_fields or (optional_nullable and is_set)
203
+ ):
204
+ m[k] = val
205
+
206
+ return m
207
+
208
+
129
209
  class CustomerTypedDict(TypedDict):
130
210
  name: Nullable[str]
131
211
  email: Nullable[str]
@@ -177,6 +257,7 @@ class TrackLeadResponseBodyTypedDict(TypedDict):
177
257
  r"""A lead was tracked."""
178
258
 
179
259
  click: ClickTypedDict
260
+ link: Nullable[TrackLeadLinkTypedDict]
180
261
  customer: CustomerTypedDict
181
262
 
182
263
 
@@ -185,4 +266,36 @@ class TrackLeadResponseBody(BaseModel):
185
266
 
186
267
  click: Click
187
268
 
269
+ link: Nullable[TrackLeadLink]
270
+
188
271
  customer: Customer
272
+
273
+ @model_serializer(mode="wrap")
274
+ def serialize_model(self, handler):
275
+ optional_fields = []
276
+ nullable_fields = ["link"]
277
+ null_default_fields = []
278
+
279
+ serialized = handler(self)
280
+
281
+ m = {}
282
+
283
+ for n, f in type(self).model_fields.items():
284
+ k = f.alias or n
285
+ val = serialized.get(k)
286
+ serialized.pop(k, None)
287
+
288
+ optional_nullable = k in optional_fields and k in nullable_fields
289
+ is_set = (
290
+ self.__pydantic_fields_set__.intersection({n})
291
+ or k in null_default_fields
292
+ ) # pylint: disable=no-member
293
+
294
+ if val is not None and val != UNSET_SENTINEL:
295
+ m[k] = val
296
+ elif val != UNSET_SENTINEL and (
297
+ not k in optional_fields or (optional_nullable and is_set)
298
+ ):
299
+ m[k] = val
300
+
301
+ return m
@@ -33,10 +33,18 @@ class TrackSaleRequestBodyTypedDict(TypedDict):
33
33
  r"""The payment processor via which the sale was made."""
34
34
  invoice_id: NotRequired[Nullable[str]]
35
35
  r"""The invoice ID of the sale. Can be used as a idempotency key – only one sale event can be recorded for a given invoice ID."""
36
- lead_event_name: NotRequired[Nullable[str]]
37
- r"""The name of the lead event that occurred before the sale (case-sensitive). This is used to associate the sale event with a particular lead event (instead of the latest lead event for a link-customer combination, which is the default behavior)."""
38
36
  metadata: NotRequired[Nullable[Dict[str, Any]]]
39
37
  r"""Additional metadata to be stored with the sale event. Max 10,000 characters when stringified."""
38
+ lead_event_name: NotRequired[Nullable[str]]
39
+ r"""The name of the lead event that occurred before the sale (case-sensitive). This is used to associate the sale event with a particular lead event (instead of the latest lead event for a link-customer combination, which is the default behavior). For direct sale tracking, this field can also be used to specify the lead event name."""
40
+ click_id: NotRequired[Nullable[str]]
41
+ r"""[For direct sale tracking]: The unique ID of the click that the sale conversion event is attributed to. You can read this value from `dub_id` cookie."""
42
+ customer_name: NotRequired[Nullable[str]]
43
+ r"""[For direct sale tracking]: The name of the customer. If not passed, a random name will be generated (e.g. “Big Red Caribou”)."""
44
+ customer_email: NotRequired[Nullable[str]]
45
+ r"""[For direct sale tracking]: The email address of the customer."""
46
+ customer_avatar: NotRequired[Nullable[str]]
47
+ r"""[For direct sale tracking]: The avatar URL of the customer."""
40
48
 
41
49
 
42
50
  class TrackSaleRequestBody(BaseModel):
@@ -62,13 +70,31 @@ class TrackSaleRequestBody(BaseModel):
62
70
  )
63
71
  r"""The invoice ID of the sale. Can be used as a idempotency key – only one sale event can be recorded for a given invoice ID."""
64
72
 
73
+ metadata: OptionalNullable[Dict[str, Any]] = UNSET
74
+ r"""Additional metadata to be stored with the sale event. Max 10,000 characters when stringified."""
75
+
65
76
  lead_event_name: Annotated[
66
77
  OptionalNullable[str], pydantic.Field(alias="leadEventName")
67
78
  ] = None
68
- r"""The name of the lead event that occurred before the sale (case-sensitive). This is used to associate the sale event with a particular lead event (instead of the latest lead event for a link-customer combination, which is the default behavior)."""
79
+ r"""The name of the lead event that occurred before the sale (case-sensitive). This is used to associate the sale event with a particular lead event (instead of the latest lead event for a link-customer combination, which is the default behavior). For direct sale tracking, this field can also be used to specify the lead event name."""
69
80
 
70
- metadata: OptionalNullable[Dict[str, Any]] = UNSET
71
- r"""Additional metadata to be stored with the sale event. Max 10,000 characters when stringified."""
81
+ click_id: Annotated[OptionalNullable[str], pydantic.Field(alias="clickId")] = UNSET
82
+ r"""[For direct sale tracking]: The unique ID of the click that the sale conversion event is attributed to. You can read this value from `dub_id` cookie."""
83
+
84
+ customer_name: Annotated[
85
+ OptionalNullable[str], pydantic.Field(alias="customerName")
86
+ ] = None
87
+ r"""[For direct sale tracking]: The name of the customer. If not passed, a random name will be generated (e.g. “Big Red Caribou”)."""
88
+
89
+ customer_email: Annotated[
90
+ OptionalNullable[str], pydantic.Field(alias="customerEmail")
91
+ ] = None
92
+ r"""[For direct sale tracking]: The email address of the customer."""
93
+
94
+ customer_avatar: Annotated[
95
+ OptionalNullable[str], pydantic.Field(alias="customerAvatar")
96
+ ] = None
97
+ r"""[For direct sale tracking]: The avatar URL of the customer."""
72
98
 
73
99
  @model_serializer(mode="wrap")
74
100
  def serialize_model(self, handler):
@@ -77,11 +103,29 @@ class TrackSaleRequestBody(BaseModel):
77
103
  "eventName",
78
104
  "paymentProcessor",
79
105
  "invoiceId",
106
+ "metadata",
80
107
  "leadEventName",
108
+ "clickId",
109
+ "customerName",
110
+ "customerEmail",
111
+ "customerAvatar",
112
+ ]
113
+ nullable_fields = [
114
+ "invoiceId",
81
115
  "metadata",
116
+ "leadEventName",
117
+ "clickId",
118
+ "customerName",
119
+ "customerEmail",
120
+ "customerAvatar",
121
+ ]
122
+ null_default_fields = [
123
+ "invoiceId",
124
+ "leadEventName",
125
+ "customerName",
126
+ "customerEmail",
127
+ "customerAvatar",
82
128
  ]
83
- nullable_fields = ["invoiceId", "leadEventName", "metadata"]
84
- null_default_fields = ["invoiceId", "leadEventName"]
85
129
 
86
130
  serialized = handler(self)
87
131
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dub
3
- Version: 0.29.0
3
+ Version: 0.29.2
4
4
  Summary: Python Client SDK Generated by Speakeasy
5
5
  Author: Speakeasy
6
6
  Requires-Python: >=3.9.2
@@ -3,7 +3,7 @@ dub/_hooks/__init__.py,sha256=9_7W5jAYw8rcO8Kfc-Ty-lB82BHfksAJJpVFb_UeU1c,146
3
3
  dub/_hooks/registration.py,sha256=tT-1Cjp5ax1DL-84HBNWPy4wAwgP-0aI4-asLfnkIlw,625
4
4
  dub/_hooks/sdkhooks.py,sha256=2rLEjSz1xFGWabNs1voFn0lXSCqkS38bdKVFdnBJufE,2553
5
5
  dub/_hooks/types.py,sha256=5vcNbFBNpCxqI7ZebiBtut7T_Gz2i36L5MjTqGvxV7Y,3035
6
- dub/_version.py,sha256=OK6WDstVS6QdLmv-8eIHWnssVpyVSMRzAyVfn-1HYSM,450
6
+ dub/_version.py,sha256=N29ZAEFk7UwmXSFi--vcG2_xxJF0xBgDwKTbsgSYFpU,450
7
7
  dub/analytics.py,sha256=D4s6aPCiCVxwbG2bIvanBiaDtYZgN1xMwu5DOnuRrVg,12342
8
8
  dub/basesdk.py,sha256=ZpolQ0D1eZ93wq3jecXpg7RHj8NuFodyWkk9l4eIcqY,12108
9
9
  dub/commissions.py,sha256=OzDAs372f4VszeKJNkR4pR7q5SNI4JiCwz-bzny0YMc,24346
@@ -52,20 +52,20 @@ dub/models/components/tagschema.py,sha256=jZ2MFrE9ctCqR18S0GV-czRTcViglbpl-9h7pU
52
52
  dub/models/components/webhookevent.py,sha256=12SgBns1nVcb0Efs8JR9JO8vmvK25bXMROCT-s0Ue5c,1268
53
53
  dub/models/components/workspaceschema.py,sha256=hS846LkmNv5ZdYZvT1eY7wCQ6-xs_5XMAc2VmdBjPtk,10898
54
54
  dub/models/errors/__init__.py,sha256=puGRbwSI00uEfD5rs_zvN4GtHhVFXRqrkK60R_nSI24,6462
55
- dub/models/errors/badrequest.py,sha256=G5UFXCXOZy5raqCb_UpY409hSNT0V8lCiQxZs5iCri8,1646
56
- dub/models/errors/conflict.py,sha256=tDqlH_1HgU17AgVE2RNH3vnFo1XY03ptSanRtvx3qK0,1562
57
- dub/models/errors/duberror.py,sha256=wD61h62qi9-hdtxHDO6w7cbWIEoqgO0x32ZovrP8dsQ,710
58
- dub/models/errors/forbidden.py,sha256=1QYRWzTfdToEuHPb3v0h2t-ZIz7ZlEmkfWX-C00xEu0,1702
59
- dub/models/errors/internalservererror.py,sha256=0V_yzHpfZtvXssaVidtA0xDKUbx5NFJQ7eulXfewjuE,1684
60
- dub/models/errors/inviteexpired.py,sha256=9kh9LgytmePcdFRjfWZ9WvlUi0YTTkYwep_eMnpx_JM,1658
61
- dub/models/errors/no_response_error.py,sha256=FQG44Lq6uF7uUlzbUYfM3dJon6sbqXzJ0Ri6YrDdsEs,380
62
- dub/models/errors/notfound.py,sha256=xvO65GYKrJTEvG8aKBeoXE0BKjV9yO6KAFF5G-Pvnk4,1526
63
- dub/models/errors/ratelimitexceeded.py,sha256=A7jZeyuQ7uLYNoHxsEyWWvGLrSSkIEeHNFCUA9f1m2g,1671
64
- dub/models/errors/responsevalidationerror.py,sha256=SRWiFq2Ip-M7luHULq3POe4JSWzOOVzv9rFYkqpvv74,683
65
- dub/models/errors/sdkerror.py,sha256=iWxT-KvUgOlqID84qtbl7jG88f3xF9bxVCnMrtshtA0,1216
66
- dub/models/errors/unauthorized.py,sha256=gTybq5vCh3nFKAnERxwMwETlQZ3T3SR01RKooIreVdo,1710
67
- dub/models/errors/unprocessableentity.py,sha256=EkqNdp5lZQHA8hJgNdA3gviqMmyjcFx02cTxl3yhyrs,1693
68
- dub/models/operations/__init__.py,sha256=E4E9CC-KMmY16v02O1LRExzMUkgF6dM_ltzVaw6vhac,42255
55
+ dub/models/errors/badrequest.py,sha256=3QLoIWGXDFBY874Y6yAyWKWLG6VAC8T60ofw7ipM-mU,1753
56
+ dub/models/errors/conflict.py,sha256=Or-nd9nyQjst4kdPqXAkC2SvcY62ubeWmJdyOjSzZvk,1669
57
+ dub/models/errors/duberror.py,sha256=Cztxki1rHUm-SDDaDb50dtwpJlBPzcREDM5JOmG0UsI,947
58
+ dub/models/errors/forbidden.py,sha256=3gC71S2V8W7afmVEcpP9PD0yVGWGQMQIiBrq17Ze5Ok,1809
59
+ dub/models/errors/internalservererror.py,sha256=2pkNhCyy8TNSvsqNQ5-JtNLiE6nRzFVG4G2lq9EU0KI,1791
60
+ dub/models/errors/inviteexpired.py,sha256=sndvpOaVdey_WRZelxmiF7jJpynZtRj7zrAB6CXl7E0,1765
61
+ dub/models/errors/no_response_error.py,sha256=Kb7hmMtDo72KrLSjUEDNeQxvzZiVxUjOZym8TPdZp5Y,462
62
+ dub/models/errors/notfound.py,sha256=E2qybbN2xqv4EpDM8Dble3ryVjDpzOdIxYz-95XuKm8,1633
63
+ dub/models/errors/ratelimitexceeded.py,sha256=1sDdfbD5lwmPNiZYARETfJ0iLvBuRdrWkxodz1yzZrI,1778
64
+ dub/models/errors/responsevalidationerror.py,sha256=z0Dc-sVC6O0v-jMNCbYZ84T9dn-XltQmg6637V_LvNw,741
65
+ dub/models/errors/sdkerror.py,sha256=5v2HMPqQq492bLrgqCUUTWqv2mwdOP1DeW5lyowb9y8,1274
66
+ dub/models/errors/unauthorized.py,sha256=ReCyH8clMYQEzmIUYsACJskkeTYI7dCD5TYOvCmAyxk,1817
67
+ dub/models/errors/unprocessableentity.py,sha256=cHavD0WoazsbK9caQQYfbE_jZcZ_SpPv_yNpMk3DXl0,1800
68
+ dub/models/operations/__init__.py,sha256=6QGs9nw8vRYABShC-xkeD2XooGq2t9oZiJGv2NwOjAI,42440
69
69
  dub/models/operations/bulkcreatelinks.py,sha256=OZNtpJ96LE_33GGD3XsaXN43w3GxA2Oqwmspu1wrGvI,17832
70
70
  dub/models/operations/bulkdeletelinks.py,sha256=u_hEFC9TZ1UnGGgLhQ-Mf3HNDO98Ur49MtdBnNVIRsE,1151
71
71
  dub/models/operations/bulkupdatelinks.py,sha256=TCkPBC7wD-EZdJm0m9XSznY7sNF8pixyXPXokb3S4XY,15879
@@ -100,8 +100,8 @@ dub/models/operations/registerdomain.py,sha256=fjozn1tFU-cNarHdAqN_flQoGAE498ob-
100
100
  dub/models/operations/retrieveanalytics.py,sha256=4dRnXcathBqM34MPZV6pE_fMYe3P3CVIb53-i8TRemo,20421
101
101
  dub/models/operations/retrievelinks.py,sha256=rMp0VPEdwLT5ekQ3g2eAHwlr8-4EaEw699yLzDqTXzk,2855
102
102
  dub/models/operations/retrievepartneranalytics.py,sha256=up_lKTeJBLQBmVaPOU9r06t-TysfnePx9eM5h6sFci4,5328
103
- dub/models/operations/tracklead.py,sha256=iJLteV9tKPphqrN9tgtZvF3xIFpx1tJ2tlZLfVfmn4A,7446
104
- dub/models/operations/tracksale.py,sha256=BPem53rbyCjrq_qdoRddxN1LKyY6rNPt1Cl9fUNw3jM,9102
103
+ dub/models/operations/tracklead.py,sha256=PU8PalO8wE3EzcgA8BFg4BuYwqcMpF6tDj0xt-Q1UAg,11931
104
+ dub/models/operations/tracksale.py,sha256=F604McUWJ-cjNeXDV-bvUKD7pEnsbOUdbzTsWt8vfFk,11172
105
105
  dub/models/operations/updatecommission.py,sha256=N_okp7jc6jqI4CnGRvTEKTw-QPb5DEwGVGfKmOSRQrY,11019
106
106
  dub/models/operations/updatecustomer.py,sha256=xlW-W99WgdlAsKD4fNhIEw3f1Sipnb4ahPnZFOcisSY,13517
107
107
  dub/models/operations/updatedomain.py,sha256=rexCga7uNxgBZLPiCMcaudc2cQGB0E_qX2HI0DgG_3M,4519
@@ -138,7 +138,7 @@ dub/utils/unmarshal_json_response.py,sha256=FcgE-IWPMAHWDdw6QEZeLeD5G_rflScZbT10
138
138
  dub/utils/url.py,sha256=BgGPgcTA6MRK4bF8fjP2dUopN3NzEzxWMXPBVg8NQUA,5254
139
139
  dub/utils/values.py,sha256=CcaCXEa3xHhkUDROyXZocN8f0bdITftv9Y0P9lTf0YM,3517
140
140
  dub/workspaces.py,sha256=qqg3JuPFsC14D9OqUeMxYvXHOoIJOJ9To1faAG7x8kM,24373
141
- dub-0.29.0.dist-info/LICENSE,sha256=kc_aZ6YHHcdSsRy-mGsT0Ehji0ZgR_zevXiUt05V2KY,1079
142
- dub-0.29.0.dist-info/METADATA,sha256=0ML7kpyrfxPlXenUGN_zaPeo9MepwpH8sh6LJLe7UJc,30669
143
- dub-0.29.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
144
- dub-0.29.0.dist-info/RECORD,,
141
+ dub-0.29.2.dist-info/LICENSE,sha256=kc_aZ6YHHcdSsRy-mGsT0Ehji0ZgR_zevXiUt05V2KY,1079
142
+ dub-0.29.2.dist-info/METADATA,sha256=-POgUVwf4HFaPufvEWbFnY_oAA3eewMiw94cClaoV2k,30669
143
+ dub-0.29.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
144
+ dub-0.29.2.dist-info/RECORD,,
File without changes
File without changes