dub 0.29.1__py3-none-any.whl → 0.29.3__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 +3 -3
- dub/models/errors/badrequest.py +4 -2
- dub/models/errors/conflict.py +4 -2
- dub/models/errors/duberror.py +11 -7
- dub/models/errors/forbidden.py +4 -2
- dub/models/errors/internalservererror.py +4 -2
- dub/models/errors/inviteexpired.py +4 -2
- dub/models/errors/no_response_error.py +5 -1
- dub/models/errors/notfound.py +4 -2
- dub/models/errors/ratelimitexceeded.py +4 -2
- dub/models/errors/responsevalidationerror.py +2 -0
- dub/models/errors/sdkerror.py +2 -0
- dub/models/errors/unauthorized.py +4 -2
- dub/models/errors/unprocessableentity.py +4 -2
- dub/models/operations/__init__.py +6 -0
- dub/models/operations/tracklead.py +113 -0
- dub/models/operations/tracksale.py +10 -10
- {dub-0.29.1.dist-info → dub-0.29.3.dist-info}/METADATA +1 -1
- {dub-0.29.1.dist-info → dub-0.29.3.dist-info}/RECORD +21 -21
- {dub-0.29.1.dist-info → dub-0.29.3.dist-info}/LICENSE +0 -0
- {dub-0.29.1.dist-info → dub-0.29.3.dist-info}/WHEEL +0 -0
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.
|
|
6
|
+
__version__: str = "0.29.3"
|
|
7
7
|
__openapi_doc_version__: str = "0.0.1"
|
|
8
|
-
__gen_version__: str = "2.698.
|
|
9
|
-
__user_agent__: str = "speakeasy-sdk/python 0.29.
|
|
8
|
+
__gen_version__: str = "2.698.4"
|
|
9
|
+
__user_agent__: str = "speakeasy-sdk/python 0.29.3 2.698.4 0.0.1 dub"
|
|
10
10
|
|
|
11
11
|
try:
|
|
12
12
|
if __package__ is not None:
|
dub/models/errors/badrequest.py
CHANGED
|
@@ -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
|
|
58
|
+
object.__setattr__(self, "data", data)
|
dub/models/errors/conflict.py
CHANGED
|
@@ -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
|
|
58
|
+
object.__setattr__(self, "data", data)
|
dub/models/errors/duberror.py
CHANGED
|
@@ -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
|
|
20
|
-
self
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
dub/models/errors/forbidden.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
13
|
+
object.__setattr__(self, "message", message)
|
|
10
14
|
super().__init__(message)
|
|
11
15
|
|
|
12
16
|
def __str__(self):
|
dub/models/errors/notfound.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
dub/models/errors/sdkerror.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
@@ -36,15 +36,15 @@ class TrackSaleRequestBodyTypedDict(TypedDict):
|
|
|
36
36
|
metadata: NotRequired[Nullable[Dict[str, Any]]]
|
|
37
37
|
r"""Additional metadata to be stored with the sale event. Max 10,000 characters when stringified."""
|
|
38
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 sale tracking
|
|
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
40
|
click_id: NotRequired[Nullable[str]]
|
|
41
|
-
r"""[For sale tracking
|
|
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
42
|
customer_name: NotRequired[Nullable[str]]
|
|
43
|
-
r"""[For sale tracking
|
|
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
44
|
customer_email: NotRequired[Nullable[str]]
|
|
45
|
-
r"""[For sale tracking
|
|
45
|
+
r"""[For direct sale tracking]: The email address of the customer."""
|
|
46
46
|
customer_avatar: NotRequired[Nullable[str]]
|
|
47
|
-
r"""[For sale tracking
|
|
47
|
+
r"""[For direct sale tracking]: The avatar URL of the customer."""
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
class TrackSaleRequestBody(BaseModel):
|
|
@@ -76,25 +76,25 @@ class TrackSaleRequestBody(BaseModel):
|
|
|
76
76
|
lead_event_name: Annotated[
|
|
77
77
|
OptionalNullable[str], pydantic.Field(alias="leadEventName")
|
|
78
78
|
] = None
|
|
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 sale tracking
|
|
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."""
|
|
80
80
|
|
|
81
81
|
click_id: Annotated[OptionalNullable[str], pydantic.Field(alias="clickId")] = UNSET
|
|
82
|
-
r"""[For sale tracking
|
|
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
83
|
|
|
84
84
|
customer_name: Annotated[
|
|
85
85
|
OptionalNullable[str], pydantic.Field(alias="customerName")
|
|
86
86
|
] = None
|
|
87
|
-
r"""[For sale tracking
|
|
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
88
|
|
|
89
89
|
customer_email: Annotated[
|
|
90
90
|
OptionalNullable[str], pydantic.Field(alias="customerEmail")
|
|
91
91
|
] = None
|
|
92
|
-
r"""[For sale tracking
|
|
92
|
+
r"""[For direct sale tracking]: The email address of the customer."""
|
|
93
93
|
|
|
94
94
|
customer_avatar: Annotated[
|
|
95
95
|
OptionalNullable[str], pydantic.Field(alias="customerAvatar")
|
|
96
96
|
] = None
|
|
97
|
-
r"""[For sale tracking
|
|
97
|
+
r"""[For direct sale tracking]: The avatar URL of the customer."""
|
|
98
98
|
|
|
99
99
|
@model_serializer(mode="wrap")
|
|
100
100
|
def serialize_model(self, handler):
|
|
@@ -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=
|
|
6
|
+
dub/_version.py,sha256=2F0636Bg-VZ7ybi5_LVAPzwBDsgM5ZSku5A6LqoN2Uc,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=
|
|
56
|
-
dub/models/errors/conflict.py,sha256=
|
|
57
|
-
dub/models/errors/duberror.py,sha256=
|
|
58
|
-
dub/models/errors/forbidden.py,sha256=
|
|
59
|
-
dub/models/errors/internalservererror.py,sha256=
|
|
60
|
-
dub/models/errors/inviteexpired.py,sha256=
|
|
61
|
-
dub/models/errors/no_response_error.py,sha256=
|
|
62
|
-
dub/models/errors/notfound.py,sha256=
|
|
63
|
-
dub/models/errors/ratelimitexceeded.py,sha256=
|
|
64
|
-
dub/models/errors/responsevalidationerror.py,sha256=
|
|
65
|
-
dub/models/errors/sdkerror.py,sha256=
|
|
66
|
-
dub/models/errors/unauthorized.py,sha256=
|
|
67
|
-
dub/models/errors/unprocessableentity.py,sha256=
|
|
68
|
-
dub/models/operations/__init__.py,sha256=
|
|
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=
|
|
104
|
-
dub/models/operations/tracksale.py,sha256=
|
|
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.
|
|
142
|
-
dub-0.29.
|
|
143
|
-
dub-0.29.
|
|
144
|
-
dub-0.29.
|
|
141
|
+
dub-0.29.3.dist-info/LICENSE,sha256=kc_aZ6YHHcdSsRy-mGsT0Ehji0ZgR_zevXiUt05V2KY,1079
|
|
142
|
+
dub-0.29.3.dist-info/METADATA,sha256=AQBuAPuKXIS1Ewvz1QS0xucXJFGve7t2V8m3ssYooVg,30669
|
|
143
|
+
dub-0.29.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
144
|
+
dub-0.29.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|