ttd-data 0.2.3__tar.gz → 0.2.5__tar.gz

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.
Files changed (110) hide show
  1. {ttd_data-0.2.3/src/ttd_data.egg-info → ttd_data-0.2.5}/PKG-INFO +2 -2
  2. {ttd_data-0.2.3 → ttd_data-0.2.5}/pyproject.toml +2 -2
  3. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/__init__.py +1 -0
  4. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/_hooks/types.py +13 -1
  5. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/_version.py +3 -3
  6. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/advertiser.py +4 -0
  7. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/client.py +23 -1
  8. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/deletionoptout.py +12 -0
  9. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdataserverresponseline.py +9 -2
  10. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdsrfailedline.py +14 -1
  11. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/dsrerrorcode.py +1 -0
  12. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/merchantdsrfailedline.py +9 -2
  13. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydataserverresponseline.py +14 -1
  14. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydsrfailedline.py +16 -2
  15. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/offlineconversion.py +4 -0
  16. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/thirdparty.py +4 -0
  17. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/__init__.py +3 -1
  18. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/datetimes.py +15 -1
  19. {ttd_data-0.2.3 → ttd_data-0.2.5/src/ttd_data.egg-info}/PKG-INFO +2 -2
  20. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data.egg-info/requires.txt +1 -1
  21. {ttd_data-0.2.3 → ttd_data-0.2.5}/LICENSE +0 -0
  22. {ttd_data-0.2.3 → ttd_data-0.2.5}/NOTICES.txt +0 -0
  23. {ttd_data-0.2.3 → ttd_data-0.2.5}/README-PYPI.md +0 -0
  24. {ttd_data-0.2.3 → ttd_data-0.2.5}/README.md +0 -0
  25. {ttd_data-0.2.3 → ttd_data-0.2.5}/setup.cfg +0 -0
  26. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/_hooks/__init__.py +0 -0
  27. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/_hooks/data_origins_hook.py +0 -0
  28. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/_hooks/plain_text_error_normalizer.py +0 -0
  29. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/_hooks/registration.py +0 -0
  30. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/_hooks/sdkhooks.py +0 -0
  31. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/basesdk.py +0 -0
  32. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/__init__.py +0 -0
  33. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/advertiserdataserverresponse_error.py +0 -0
  34. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/advertiserdsrresponse_error.py +0 -0
  35. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/apierror.py +0 -0
  36. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/dataerror.py +0 -0
  37. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/merchantdsrresponse_error.py +0 -0
  38. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/no_response_error.py +0 -0
  39. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/offlineconversiondataserverresponse_error.py +0 -0
  40. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/responsevalidationerror.py +0 -0
  41. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/thirdpartydataserverresponse_error.py +0 -0
  42. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/thirdpartydsrresponse_error.py +0 -0
  43. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/ttddataerror.py +0 -0
  44. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/errors/uid2serviceerror.py +0 -0
  45. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/httpclient.py +0 -0
  46. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/__init__.py +0 -0
  47. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdata.py +0 -0
  48. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdatarequest.py +0 -0
  49. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdataresponseerrorcode.py +0 -0
  50. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdataserverresponse.py +0 -0
  51. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdsrrequest.py +0 -0
  52. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/advertiserdsrresponse.py +0 -0
  53. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/baseadvertiserdataitem.py +0 -0
  54. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/baseofflineconversiondataitem.py +0 -0
  55. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/basepartnerdsrdataitem.py +0 -0
  56. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/basethirdpartydataitem.py +0 -0
  57. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/dataorigin.py +0 -0
  58. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/dataorigintype.py +0 -0
  59. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/datasubjectrequestadvertiserdataop.py +0 -0
  60. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/datasubjectrequestmerchantdataop.py +0 -0
  61. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/datasubjectrequestthirdpartydataop.py +0 -0
  62. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/httpmetadata.py +0 -0
  63. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/ingestadvertiserdataop.py +0 -0
  64. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/ingestofflineconversiondataop.py +0 -0
  65. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/ingestthirdpartydataop.py +0 -0
  66. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/merchantdsrrequest.py +0 -0
  67. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/merchantdsrresponse.py +0 -0
  68. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/offlineconversiondatarequest.py +0 -0
  69. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/offlineconversiondataresponseerrorcode.py +0 -0
  70. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/offlineconversiondataserverresponse.py +0 -0
  71. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/offlineconversiondataserverresponseline.py +0 -0
  72. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/partnerdsrrequesttype.py +0 -0
  73. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/realtimeconversioneventlineitem.py +0 -0
  74. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/realtimeconversioneventsprivacysetting.py +0 -0
  75. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydata.py +0 -0
  76. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydatarequest.py +0 -0
  77. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydataresponseerrorcode.py +0 -0
  78. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydataserverresponse.py +0 -0
  79. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydsrrequest.py +0 -0
  80. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/models/thirdpartydsrresponse.py +0 -0
  81. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/py.typed +0 -0
  82. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/sdk.py +0 -0
  83. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/sdkconfiguration.py +0 -0
  84. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/types/__init__.py +0 -0
  85. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/types/base64fileinput.py +0 -0
  86. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/types/basemodel.py +0 -0
  87. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/uid2/__init__.py +0 -0
  88. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/uid2/config.py +0 -0
  89. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/uid2/models.py +0 -0
  90. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/uid2/resolver.py +0 -0
  91. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/annotations.py +0 -0
  92. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/dynamic_imports.py +0 -0
  93. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/enums.py +0 -0
  94. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/eventstreaming.py +0 -0
  95. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/forms.py +0 -0
  96. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/headers.py +0 -0
  97. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/logger.py +0 -0
  98. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/metadata.py +0 -0
  99. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/queryparams.py +0 -0
  100. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/requestbodies.py +0 -0
  101. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/retries.py +0 -0
  102. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/security.py +0 -0
  103. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/serializers.py +0 -0
  104. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/unmarshal_json_response.py +0 -0
  105. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/url.py +0 -0
  106. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data/utils/values.py +0 -0
  107. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data.egg-info/SOURCES.txt +0 -0
  108. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data.egg-info/dependency_links.txt +0 -0
  109. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data.egg-info/top_level.txt +0 -0
  110. {ttd_data-0.2.3 → ttd_data-0.2.5}/src/ttd_data_python/_hooks/registration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ttd-data
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: Python Client SDK for TTD Data API.
5
5
  Author: Speakeasy
6
6
  License: map[name:Apache License 2.0 shortName:Apache-2.0 url:https://www.apache.org/licenses/LICENSE-2.0]
@@ -11,7 +11,7 @@ License-File: LICENSE
11
11
  License-File: NOTICES.txt
12
12
  Requires-Dist: httpcore>=1.0.9
13
13
  Requires-Dist: httpx>=0.28.1
14
- Requires-Dist: pydantic>=2.11.2
14
+ Requires-Dist: pydantic<2.13,>=2.11.2
15
15
  Requires-Dist: uid2-client<3.0.0,>=2.9.0
16
16
  Dynamic: license-file
17
17
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ttd-data"
3
- version = "0.2.3"
3
+ version = "0.2.5"
4
4
  description = "Python Client SDK for TTD Data API."
5
5
  authors = [{ name = "Speakeasy" },]
6
6
  readme = "README-PYPI.md"
@@ -8,7 +8,7 @@ requires-python = ">=3.10"
8
8
  dependencies = [
9
9
  "httpcore >=1.0.9",
10
10
  "httpx >=0.28.1",
11
- "pydantic >=2.11.2",
11
+ "pydantic >=2.11.2,<2.13",
12
12
  "uid2-client >=2.9.0,<3.0.0",
13
13
  ]
14
14
  urls.repository = "https://github.com/thetradedesk/ttd-data-python.git"
@@ -11,6 +11,7 @@ from ._version import (
11
11
  from .sdkconfiguration import *
12
12
  # region: Manually edited code section
13
13
  # pylint: disable=useless-import-alias
14
+ from .client import ClientConfig as ClientConfig
14
15
  from .client import DataClient as DataClient
15
16
  from .uid2 import (
16
17
  IdentityScope as IdentityScope,
@@ -4,7 +4,7 @@
4
4
  from abc import ABC, abstractmethod
5
5
  import httpx
6
6
  from ttd_data.sdkconfiguration import SDKConfiguration
7
- from typing import Any, Callable, List, Optional, Tuple, Union
7
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
8
8
 
9
9
 
10
10
  class HookContext:
@@ -13,6 +13,8 @@ class HookContext:
13
13
  operation_id: str
14
14
  oauth2_scopes: Optional[List[str]] = None
15
15
  security_source: Optional[Union[Any, Callable[[], Any]]] = None
16
+ tags: Optional[List[str]] = None
17
+ extensions: Optional[Dict[str, Any]] = None
16
18
 
17
19
  def __init__(
18
20
  self,
@@ -21,12 +23,16 @@ class HookContext:
21
23
  operation_id: str,
22
24
  oauth2_scopes: Optional[List[str]],
23
25
  security_source: Optional[Union[Any, Callable[[], Any]]],
26
+ tags: Optional[List[str]],
27
+ extensions: Optional[Dict[str, Any]],
24
28
  ):
25
29
  self.config = config
26
30
  self.base_url = base_url
27
31
  self.operation_id = operation_id
28
32
  self.oauth2_scopes = oauth2_scopes
29
33
  self.security_source = security_source
34
+ self.tags = tags
35
+ self.extensions = extensions
30
36
 
31
37
 
32
38
  class BeforeRequestContext(HookContext):
@@ -37,6 +43,8 @@ class BeforeRequestContext(HookContext):
37
43
  hook_ctx.operation_id,
38
44
  hook_ctx.oauth2_scopes,
39
45
  hook_ctx.security_source,
46
+ hook_ctx.tags,
47
+ hook_ctx.extensions,
40
48
  )
41
49
 
42
50
 
@@ -48,6 +56,8 @@ class AfterSuccessContext(HookContext):
48
56
  hook_ctx.operation_id,
49
57
  hook_ctx.oauth2_scopes,
50
58
  hook_ctx.security_source,
59
+ hook_ctx.tags,
60
+ hook_ctx.extensions,
51
61
  )
52
62
 
53
63
 
@@ -59,6 +69,8 @@ class AfterErrorContext(HookContext):
59
69
  hook_ctx.operation_id,
60
70
  hook_ctx.oauth2_scopes,
61
71
  hook_ctx.security_source,
72
+ hook_ctx.tags,
73
+ hook_ctx.extensions,
62
74
  )
63
75
 
64
76
 
@@ -4,10 +4,10 @@
4
4
  import importlib.metadata
5
5
 
6
6
  __title__: str = "ttd-data"
7
- __version__: str = "0.2.3"
7
+ __version__: str = "0.2.5"
8
8
  __openapi_doc_version__: str = "v0.1"
9
- __gen_version__: str = "2.912.1"
10
- __user_agent__: str = "speakeasy-sdk/python 0.2.3 2.912.1 v0.1 ttd-data"
9
+ __gen_version__: str = "2.916.2"
10
+ __user_agent__: str = "speakeasy-sdk/python 0.2.5 2.916.2 v0.1 ttd-data"
11
11
 
12
12
  try:
13
13
  if __package__ is not None:
@@ -103,6 +103,8 @@ class Advertiser(BaseSDK):
103
103
  operation_id="IngestAdvertiserData",
104
104
  oauth2_scopes=None,
105
105
  security_source=None,
106
+ tags=["Advertiser"],
107
+ extensions=None,
106
108
  ),
107
109
  request=req,
108
110
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -227,6 +229,8 @@ class Advertiser(BaseSDK):
227
229
  operation_id="IngestAdvertiserData",
228
230
  oauth2_scopes=None,
229
231
  security_source=None,
232
+ tags=["Advertiser"],
233
+ extensions=None,
230
234
  ),
231
235
  request=req,
232
236
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -6,13 +6,15 @@ from __future__ import annotations
6
6
  # pylint: disable=protected-access
7
7
 
8
8
  import asyncio
9
+ from dataclasses import dataclass
9
10
  from functools import cached_property
10
11
  from typing import Any, Dict, Iterable, List, Optional, Tuple, Type
11
12
 
12
13
  from uid2_client import IdentityMapV3Client, IdentityMapV3Input # type: ignore[import-not-found,import-untyped]
13
14
 
14
15
  from ttd_data.sdk import BaseDataClient
15
- from ttd_data.types import BaseModel
16
+ from ttd_data.types import BaseModel, OptionalNullable
17
+ from ttd_data.utils import RetryConfig
16
18
  from ttd_data.models.advertiserdataresponseerrorcode import (
17
19
  AdvertiserDataResponseErrorCode,
18
20
  )
@@ -51,6 +53,14 @@ from .uid2.resolver import (
51
53
  )
52
54
 
53
55
 
56
+ @dataclass(frozen=True)
57
+ class ClientConfig:
58
+ server_url: Optional[str]
59
+ retry_config: OptionalNullable[RetryConfig]
60
+ timeout_ms: Optional[int]
61
+ uid2_config: Optional[UID2Config]
62
+
63
+
54
64
  class DataClient:
55
65
  """DataClient for the ttd-data SDK — enables ingesting advertiser,
56
66
  third-party, offline-conversion, and deletion-opt-out data to the
@@ -71,6 +81,18 @@ class DataClient:
71
81
  self.uid2_config = uid2_config
72
82
  self.data_client = data_client or BaseDataClient(**data_client_kwargs)
73
83
 
84
+ @property
85
+ def config(self) -> ClientConfig:
86
+ """Read-only view of this client's settings, exposed immutably to
87
+ prevent callers from mutating live client state."""
88
+ sdk_config = self.data_client.sdk_configuration
89
+ return ClientConfig(
90
+ server_url=sdk_config.server_url,
91
+ retry_config=sdk_config.retry_config,
92
+ timeout_ms=sdk_config.timeout_ms,
93
+ uid2_config=self.uid2_config,
94
+ )
95
+
74
96
  # ----- UID2 identity-map wiring (internal) -----
75
97
 
76
98
  @cached_property
@@ -99,6 +99,8 @@ class DeletionOptOut(BaseSDK):
99
99
  operation_id="DataSubjectRequestAdvertiserData",
100
100
  oauth2_scopes=None,
101
101
  security_source=None,
102
+ tags=["DeletionOptOut"],
103
+ extensions=None,
102
104
  ),
103
105
  request=req,
104
106
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -219,6 +221,8 @@ class DeletionOptOut(BaseSDK):
219
221
  operation_id="DataSubjectRequestAdvertiserData",
220
222
  oauth2_scopes=None,
221
223
  security_source=None,
224
+ tags=["DeletionOptOut"],
225
+ extensions=None,
222
226
  ),
223
227
  request=req,
224
228
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -336,6 +340,8 @@ class DeletionOptOut(BaseSDK):
336
340
  operation_id="DataSubjectRequestMerchantData",
337
341
  oauth2_scopes=None,
338
342
  security_source=None,
343
+ tags=["DeletionOptOut"],
344
+ extensions=None,
339
345
  ),
340
346
  request=req,
341
347
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -453,6 +459,8 @@ class DeletionOptOut(BaseSDK):
453
459
  operation_id="DataSubjectRequestMerchantData",
454
460
  oauth2_scopes=None,
455
461
  security_source=None,
462
+ tags=["DeletionOptOut"],
463
+ extensions=None,
456
464
  ),
457
465
  request=req,
458
466
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -573,6 +581,8 @@ class DeletionOptOut(BaseSDK):
573
581
  operation_id="DataSubjectRequestThirdPartyData",
574
582
  oauth2_scopes=None,
575
583
  security_source=None,
584
+ tags=["DeletionOptOut"],
585
+ extensions=None,
576
586
  ),
577
587
  request=req,
578
588
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -693,6 +703,8 @@ class DeletionOptOut(BaseSDK):
693
703
  operation_id="DataSubjectRequestThirdPartyData",
694
704
  oauth2_scopes=None,
695
705
  security_source=None,
706
+ tags=["DeletionOptOut"],
707
+ extensions=None,
696
708
  ),
697
709
  request=req,
698
710
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -16,6 +16,7 @@ class AdvertiserDataServerResponseLineTypedDict(TypedDict):
16
16
  error_code: NotRequired[AdvertiserDataResponseErrorCode]
17
17
  message: NotRequired[Nullable[str]]
18
18
  item_number: NotRequired[Nullable[str]]
19
+ data_number: NotRequired[Nullable[str]]
19
20
 
20
21
 
21
22
  class AdvertiserDataServerResponseLine(BaseModel):
@@ -35,12 +36,18 @@ class AdvertiserDataServerResponseLine(BaseModel):
35
36
  OptionalNullable[str], pydantic.Field(alias="ItemNumber")
36
37
  ] = UNSET
37
38
 
39
+ data_number: Annotated[
40
+ OptionalNullable[str], pydantic.Field(alias="DataNumber")
41
+ ] = UNSET
42
+
38
43
  @model_serializer(mode="wrap")
39
44
  def serialize_model(self, handler):
40
45
  optional_fields = set(
41
- ["TDID", "DataName", "ErrorCode", "Message", "ItemNumber"]
46
+ ["TDID", "DataName", "ErrorCode", "Message", "ItemNumber", "DataNumber"]
47
+ )
48
+ nullable_fields = set(
49
+ ["TDID", "DataName", "Message", "ItemNumber", "DataNumber"]
42
50
  )
43
- nullable_fields = set(["TDID", "DataName", "Message", "ItemNumber"])
44
51
  serialized = handler(self)
45
52
  m = {}
46
53
 
@@ -17,6 +17,7 @@ class AdvertiserDsrFailedLineTypedDict(TypedDict):
17
17
  error_code: NotRequired[DsrErrorCode]
18
18
  message: NotRequired[Nullable[str]]
19
19
  item_number: NotRequired[Nullable[str]]
20
+ data_number: NotRequired[Nullable[str]]
20
21
 
21
22
 
22
23
  class AdvertiserDsrFailedLine(BaseModel):
@@ -40,6 +41,10 @@ class AdvertiserDsrFailedLine(BaseModel):
40
41
  OptionalNullable[str], pydantic.Field(alias="ItemNumber")
41
42
  ] = UNSET
42
43
 
44
+ data_number: Annotated[
45
+ OptionalNullable[str], pydantic.Field(alias="DataNumber")
46
+ ] = UNSET
47
+
43
48
  @model_serializer(mode="wrap")
44
49
  def serialize_model(self, handler):
45
50
  optional_fields = set(
@@ -50,10 +55,18 @@ class AdvertiserDsrFailedLine(BaseModel):
50
55
  "ErrorCode",
51
56
  "Message",
52
57
  "ItemNumber",
58
+ "DataNumber",
53
59
  ]
54
60
  )
55
61
  nullable_fields = set(
56
- ["AdvertiserId", "DataProviderId", "TDID", "Message", "ItemNumber"]
62
+ [
63
+ "AdvertiserId",
64
+ "DataProviderId",
65
+ "TDID",
66
+ "Message",
67
+ "ItemNumber",
68
+ "DataNumber",
69
+ ]
57
70
  )
58
71
  serialized = handler(self)
59
72
  m = {}
@@ -8,4 +8,5 @@ from enum import Enum
8
8
  class DsrErrorCode(str, Enum):
9
9
  UNKNOWN = "Unknown"
10
10
  INVALID_USER_ID = "InvalidUserId"
11
+ ITEM_DESERIALIZATION_ERROR = "ItemDeserializationError"
11
12
  UID2_ERROR = "Uid2Error"
@@ -16,6 +16,7 @@ class MerchantDsrFailedLineTypedDict(TypedDict):
16
16
  error_code: NotRequired[DsrErrorCode]
17
17
  message: NotRequired[Nullable[str]]
18
18
  item_number: NotRequired[Nullable[str]]
19
+ data_number: NotRequired[Nullable[str]]
19
20
 
20
21
 
21
22
  class MerchantDsrFailedLine(BaseModel):
@@ -35,12 +36,18 @@ class MerchantDsrFailedLine(BaseModel):
35
36
  OptionalNullable[str], pydantic.Field(alias="ItemNumber")
36
37
  ] = UNSET
37
38
 
39
+ data_number: Annotated[
40
+ OptionalNullable[str], pydantic.Field(alias="DataNumber")
41
+ ] = UNSET
42
+
38
43
  @model_serializer(mode="wrap")
39
44
  def serialize_model(self, handler):
40
45
  optional_fields = set(
41
- ["MerchantId", "TDID", "ErrorCode", "Message", "ItemNumber"]
46
+ ["MerchantId", "TDID", "ErrorCode", "Message", "ItemNumber", "DataNumber"]
47
+ )
48
+ nullable_fields = set(
49
+ ["MerchantId", "TDID", "Message", "ItemNumber", "DataNumber"]
42
50
  )
43
- nullable_fields = set(["MerchantId", "TDID", "Message", "ItemNumber"])
44
51
  serialized = handler(self)
45
52
  m = {}
46
53
 
@@ -17,6 +17,7 @@ class ThirdPartyDataServerResponseLineTypedDict(TypedDict):
17
17
  error_code: NotRequired[ThirdPartyDataResponseErrorCode]
18
18
  message: NotRequired[Nullable[str]]
19
19
  item_number: NotRequired[Nullable[str]]
20
+ data_number: NotRequired[Nullable[str]]
20
21
 
21
22
 
22
23
  class ThirdPartyDataServerResponseLine(BaseModel):
@@ -40,6 +41,10 @@ class ThirdPartyDataServerResponseLine(BaseModel):
40
41
  OptionalNullable[str], pydantic.Field(alias="ItemNumber")
41
42
  ] = UNSET
42
43
 
44
+ data_number: Annotated[
45
+ OptionalNullable[str], pydantic.Field(alias="DataNumber")
46
+ ] = UNSET
47
+
43
48
  @model_serializer(mode="wrap")
44
49
  def serialize_model(self, handler):
45
50
  optional_fields = set(
@@ -50,10 +55,18 @@ class ThirdPartyDataServerResponseLine(BaseModel):
50
55
  "ErrorCode",
51
56
  "Message",
52
57
  "ItemNumber",
58
+ "DataNumber",
53
59
  ]
54
60
  )
55
61
  nullable_fields = set(
56
- ["DataProviderUserId", "TDID", "DataName", "Message", "ItemNumber"]
62
+ [
63
+ "DataProviderUserId",
64
+ "TDID",
65
+ "DataName",
66
+ "Message",
67
+ "ItemNumber",
68
+ "DataNumber",
69
+ ]
57
70
  )
58
71
  serialized = handler(self)
59
72
  m = {}
@@ -16,6 +16,7 @@ class ThirdPartyDsrFailedLineTypedDict(TypedDict):
16
16
  error_code: NotRequired[DsrErrorCode]
17
17
  message: NotRequired[Nullable[str]]
18
18
  item_number: NotRequired[Nullable[str]]
19
+ data_number: NotRequired[Nullable[str]]
19
20
 
20
21
 
21
22
  class ThirdPartyDsrFailedLine(BaseModel):
@@ -35,12 +36,25 @@ class ThirdPartyDsrFailedLine(BaseModel):
35
36
  OptionalNullable[str], pydantic.Field(alias="ItemNumber")
36
37
  ] = UNSET
37
38
 
39
+ data_number: Annotated[
40
+ OptionalNullable[str], pydantic.Field(alias="DataNumber")
41
+ ] = UNSET
42
+
38
43
  @model_serializer(mode="wrap")
39
44
  def serialize_model(self, handler):
40
45
  optional_fields = set(
41
- ["DataProviderId", "TDID", "ErrorCode", "Message", "ItemNumber"]
46
+ [
47
+ "DataProviderId",
48
+ "TDID",
49
+ "ErrorCode",
50
+ "Message",
51
+ "ItemNumber",
52
+ "DataNumber",
53
+ ]
54
+ )
55
+ nullable_fields = set(
56
+ ["DataProviderId", "TDID", "Message", "ItemNumber", "DataNumber"]
42
57
  )
43
- nullable_fields = set(["DataProviderId", "TDID", "Message", "ItemNumber"])
44
58
  serialized = handler(self)
45
59
  m = {}
46
60
 
@@ -105,6 +105,8 @@ class OfflineConversion(BaseSDK):
105
105
  operation_id="IngestOfflineConversionData",
106
106
  oauth2_scopes=None,
107
107
  security_source=None,
108
+ tags=["OfflineConversion"],
109
+ extensions=None,
108
110
  ),
109
111
  request=req,
110
112
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -233,6 +235,8 @@ class OfflineConversion(BaseSDK):
233
235
  operation_id="IngestOfflineConversionData",
234
236
  oauth2_scopes=None,
235
237
  security_source=None,
238
+ tags=["OfflineConversion"],
239
+ extensions=None,
236
240
  ),
237
241
  request=req,
238
242
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -103,6 +103,8 @@ class ThirdParty(BaseSDK):
103
103
  operation_id="IngestThirdPartyData",
104
104
  oauth2_scopes=None,
105
105
  security_source=None,
106
+ tags=["ThirdParty"],
107
+ extensions=None,
106
108
  ),
107
109
  request=req,
108
110
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -227,6 +229,8 @@ class ThirdParty(BaseSDK):
227
229
  operation_id="IngestThirdPartyData",
228
230
  oauth2_scopes=None,
229
231
  security_source=None,
232
+ tags=["ThirdParty"],
233
+ extensions=None,
230
234
  ),
231
235
  request=req,
232
236
  is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
@@ -16,7 +16,7 @@ async def run_sync_in_thread(func: Callable[..., _T], *args) -> _T:
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  from .annotations import get_discriminator
19
- from .datetimes import parse_datetime
19
+ from .datetimes import parse_datetime, parse_duration
20
20
  from .enums import OpenEnumMeta
21
21
  from .headers import get_headers, get_response_headers
22
22
  from .metadata import (
@@ -71,6 +71,7 @@ __all__ = [
71
71
  "get_default_logger",
72
72
  "get_discriminator",
73
73
  "parse_datetime",
74
+ "parse_duration",
74
75
  "get_global_from_env",
75
76
  "get_headers",
76
77
  "get_pydantic_model",
@@ -123,6 +124,7 @@ _dynamic_imports: dict[str, str] = {
123
124
  "get_default_logger": ".logger",
124
125
  "get_discriminator": ".annotations",
125
126
  "parse_datetime": ".datetimes",
127
+ "parse_duration": ".datetimes",
126
128
  "get_global_from_env": ".values",
127
129
  "get_headers": ".headers",
128
130
  "get_pydantic_model": ".serializers",
@@ -1,9 +1,11 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
  # @generated-id: 2d794a4852dd
3
3
 
4
- from datetime import datetime
4
+ from datetime import datetime, timedelta
5
5
  import sys
6
6
 
7
+ from pydantic import TypeAdapter
8
+
7
9
 
8
10
  def parse_datetime(datetime_string: str) -> datetime:
9
11
  """
@@ -22,3 +24,15 @@ def parse_datetime(datetime_string: str) -> datetime:
22
24
  datetime_string = datetime_string[:-1] + "+00:00"
23
25
 
24
26
  return datetime.fromisoformat(datetime_string)
27
+
28
+
29
+ _DURATION_ADAPTER = TypeAdapter(timedelta)
30
+
31
+
32
+ def parse_duration(duration_string: str) -> timedelta:
33
+ """
34
+ Convert an ISO 8601 duration string (e.g. "PT1H30M") into a timedelta.
35
+ The standard library has no ISO 8601 duration parser, so this delegates to
36
+ pydantic, which is already a runtime dependency of the SDK.
37
+ """
38
+ return _DURATION_ADAPTER.validate_python(duration_string)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ttd-data
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: Python Client SDK for TTD Data API.
5
5
  Author: Speakeasy
6
6
  License: map[name:Apache License 2.0 shortName:Apache-2.0 url:https://www.apache.org/licenses/LICENSE-2.0]
@@ -11,7 +11,7 @@ License-File: LICENSE
11
11
  License-File: NOTICES.txt
12
12
  Requires-Dist: httpcore>=1.0.9
13
13
  Requires-Dist: httpx>=0.28.1
14
- Requires-Dist: pydantic>=2.11.2
14
+ Requires-Dist: pydantic<2.13,>=2.11.2
15
15
  Requires-Dist: uid2-client<3.0.0,>=2.9.0
16
16
  Dynamic: license-file
17
17
 
@@ -1,4 +1,4 @@
1
1
  httpcore>=1.0.9
2
2
  httpx>=0.28.1
3
- pydantic>=2.11.2
3
+ pydantic<2.13,>=2.11.2
4
4
  uid2-client<3.0.0,>=2.9.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes