adcp 2.4.0__py3-none-any.whl → 2.5.0__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.
- adcp/__init__.py +91 -39
- adcp/__main__.py +1 -1
- adcp/client.py +9 -9
- adcp/simple.py +1 -1
- adcp/testing/test_helpers.py +1 -1
- adcp/types/__init__.py +69 -2
- adcp/types/{generated.py → _generated.py} +67 -11
- adcp/types/aliases.py +55 -1
- adcp/types/generated_poc/__init__.py +1 -1
- adcp/types/generated_poc/activate_signal_request.py +1 -1
- adcp/types/generated_poc/activate_signal_response.py +1 -1
- adcp/types/generated_poc/activation_key.py +1 -1
- adcp/types/generated_poc/adagents.py +1 -1
- adcp/types/generated_poc/asset_type.py +1 -1
- adcp/types/generated_poc/audio_asset.py +1 -1
- adcp/types/generated_poc/brand_manifest.py +3 -62
- adcp/types/generated_poc/build_creative_request.py +1 -1
- adcp/types/generated_poc/build_creative_response.py +1 -1
- adcp/types/generated_poc/channels.py +1 -1
- adcp/types/generated_poc/cpc_option.py +1 -1
- adcp/types/generated_poc/cpcv_option.py +1 -1
- adcp/types/generated_poc/cpm_auction_option.py +1 -1
- adcp/types/generated_poc/cpm_fixed_option.py +1 -1
- adcp/types/generated_poc/cpp_option.py +1 -1
- adcp/types/generated_poc/cpv_option.py +1 -1
- adcp/types/generated_poc/create_media_buy_request.py +2 -2
- adcp/types/generated_poc/create_media_buy_response.py +1 -1
- adcp/types/generated_poc/creative_asset.py +1 -1
- adcp/types/generated_poc/creative_assignment.py +1 -1
- adcp/types/generated_poc/creative_manifest.py +1 -1
- adcp/types/generated_poc/creative_policy.py +1 -1
- adcp/types/generated_poc/creative_status.py +1 -1
- adcp/types/generated_poc/css_asset.py +1 -1
- adcp/types/generated_poc/daast_asset.py +1 -1
- adcp/types/generated_poc/delivery_metrics.py +1 -1
- adcp/types/generated_poc/delivery_type.py +1 -1
- adcp/types/generated_poc/deployment.py +1 -1
- adcp/types/generated_poc/destination.py +1 -1
- adcp/types/generated_poc/error.py +1 -1
- adcp/types/generated_poc/flat_rate_option.py +1 -1
- adcp/types/generated_poc/format.py +1 -1
- adcp/types/generated_poc/format_id.py +1 -1
- adcp/types/generated_poc/frequency_cap.py +1 -1
- adcp/types/generated_poc/frequency_cap_scope.py +1 -1
- adcp/types/generated_poc/get_media_buy_delivery_request.py +1 -1
- adcp/types/generated_poc/get_media_buy_delivery_response.py +1 -1
- adcp/types/generated_poc/get_products_request.py +2 -2
- adcp/types/generated_poc/get_products_response.py +1 -1
- adcp/types/generated_poc/get_signals_request.py +1 -1
- adcp/types/generated_poc/get_signals_response.py +1 -1
- adcp/types/generated_poc/html_asset.py +1 -1
- adcp/types/generated_poc/identifier_types.py +1 -1
- adcp/types/generated_poc/image_asset.py +1 -1
- adcp/types/generated_poc/javascript_asset.py +1 -1
- adcp/types/generated_poc/list_authorized_properties_request.py +1 -1
- adcp/types/generated_poc/list_authorized_properties_response.py +1 -1
- adcp/types/generated_poc/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/list_creatives_request.py +1 -1
- adcp/types/generated_poc/list_creatives_response.py +2 -17
- adcp/types/generated_poc/markdown_asset.py +1 -1
- adcp/types/generated_poc/measurement.py +1 -1
- adcp/types/generated_poc/media_buy.py +1 -1
- adcp/types/generated_poc/media_buy_status.py +1 -1
- adcp/types/generated_poc/pacing.py +1 -1
- adcp/types/generated_poc/package.py +1 -1
- adcp/types/generated_poc/package_request.py +1 -1
- adcp/types/generated_poc/package_status.py +1 -1
- adcp/types/generated_poc/performance_feedback.py +1 -1
- adcp/types/generated_poc/placement.py +1 -1
- adcp/types/generated_poc/preview_creative_request.py +1 -1
- adcp/types/generated_poc/preview_creative_response.py +1 -1
- adcp/types/generated_poc/preview_render.py +1 -1
- adcp/types/generated_poc/pricing_model.py +1 -1
- adcp/types/generated_poc/product.py +25 -16
- adcp/types/generated_poc/promoted_offerings.py +2 -2
- adcp/types/generated_poc/promoted_products.py +1 -1
- adcp/types/generated_poc/property.py +1 -1
- adcp/types/generated_poc/protocol_envelope.py +1 -1
- adcp/types/generated_poc/provide_performance_feedback_request.py +1 -1
- adcp/types/generated_poc/provide_performance_feedback_response.py +1 -1
- adcp/types/generated_poc/publisher_identifier_types.py +1 -1
- adcp/types/generated_poc/push_notification_config.py +1 -1
- adcp/types/generated_poc/reporting_capabilities.py +1 -1
- adcp/types/generated_poc/response.py +1 -1
- adcp/types/generated_poc/standard_format_ids.py +1 -1
- adcp/types/generated_poc/sub_asset.py +1 -1
- adcp/types/generated_poc/sync_creatives_request.py +1 -1
- adcp/types/generated_poc/sync_creatives_response.py +1 -1
- adcp/types/generated_poc/targeting.py +1 -1
- adcp/types/generated_poc/task_status.py +1 -1
- adcp/types/generated_poc/task_type.py +1 -1
- adcp/types/generated_poc/tasks_get_request.py +1 -1
- adcp/types/generated_poc/tasks_get_response.py +1 -1
- adcp/types/generated_poc/tasks_list_request.py +1 -1
- adcp/types/generated_poc/tasks_list_response.py +1 -1
- adcp/types/generated_poc/text_asset.py +1 -1
- adcp/types/generated_poc/update_media_buy_request.py +1 -1
- adcp/types/generated_poc/update_media_buy_response.py +1 -1
- adcp/types/generated_poc/url_asset.py +1 -1
- adcp/types/generated_poc/vast_asset.py +1 -1
- adcp/types/generated_poc/vcpm_auction_option.py +1 -1
- adcp/types/generated_poc/vcpm_fixed_option.py +1 -1
- adcp/types/generated_poc/video_asset.py +1 -1
- adcp/types/generated_poc/webhook_asset.py +1 -1
- adcp/types/generated_poc/webhook_payload.py +1 -1
- adcp/types/stable.py +177 -0
- adcp/utils/preview_cache.py +6 -6
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/METADATA +45 -5
- adcp-2.5.0.dist-info/RECORD +129 -0
- adcp/types/generated_poc/brand_manifest_ref.py +0 -361
- adcp/types/generated_poc/index.py +0 -17
- adcp/types/generated_poc/pricing_option.py +0 -365
- adcp/types/generated_poc/start_timing.py +0 -13
- adcp-2.4.0.dist-info/RECORD +0 -132
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/WHEEL +0 -0
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/top_level.txt +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: product.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T05:05:53+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
7
|
from typing import Annotated, Any, Literal
|
|
8
8
|
|
|
9
9
|
from adcp.types.base import AdCPBaseModel
|
|
10
|
-
from pydantic import AwareDatetime, ConfigDict, Field, RootModel
|
|
10
|
+
from pydantic import AwareDatetime, ConfigDict, Field, RootModel
|
|
11
11
|
|
|
12
12
|
from . import cpc_option, cpcv_option, cpm_auction_option, cpm_fixed_option, cpp_option, cpv_option
|
|
13
13
|
from . import creative_policy as creative_policy_1
|
|
@@ -69,11 +69,30 @@ class ProductCardDetailed(AdCPBaseModel):
|
|
|
69
69
|
]
|
|
70
70
|
|
|
71
71
|
|
|
72
|
+
class PublisherProperties(AdCPBaseModel):
|
|
73
|
+
model_config = ConfigDict(
|
|
74
|
+
extra='forbid',
|
|
75
|
+
)
|
|
76
|
+
publisher_domain: Annotated[
|
|
77
|
+
str,
|
|
78
|
+
Field(
|
|
79
|
+
description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
|
|
80
|
+
pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
|
|
81
|
+
),
|
|
82
|
+
]
|
|
83
|
+
selection_type: Annotated[
|
|
84
|
+
Literal['all'],
|
|
85
|
+
Field(
|
|
86
|
+
description='Discriminator indicating all properties from this publisher are included'
|
|
87
|
+
),
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
|
|
72
91
|
class PropertyId(RootModel[str]):
|
|
73
92
|
root: Annotated[str, Field(pattern='^[a-z0-9_]+$')]
|
|
74
93
|
|
|
75
94
|
|
|
76
|
-
class
|
|
95
|
+
class PublisherProperties4(AdCPBaseModel):
|
|
77
96
|
model_config = ConfigDict(
|
|
78
97
|
extra='forbid',
|
|
79
98
|
)
|
|
@@ -98,7 +117,7 @@ class PropertyTag(PropertyId):
|
|
|
98
117
|
pass
|
|
99
118
|
|
|
100
119
|
|
|
101
|
-
class
|
|
120
|
+
class PublisherProperties5(AdCPBaseModel):
|
|
102
121
|
model_config = ConfigDict(
|
|
103
122
|
extra='forbid',
|
|
104
123
|
)
|
|
@@ -193,20 +212,10 @@ class Product(AdCPBaseModel):
|
|
|
193
212
|
] = None
|
|
194
213
|
product_id: Annotated[str, Field(description='Unique identifier for the product')]
|
|
195
214
|
publisher_properties: Annotated[
|
|
196
|
-
list[PublisherProperties |
|
|
215
|
+
list[PublisherProperties | PublisherProperties4 | PublisherProperties5],
|
|
197
216
|
Field(
|
|
198
|
-
description="Publisher properties covered by this product. Buyers fetch actual property definitions from each publisher's adagents.json and validate agent authorization.",
|
|
217
|
+
description="Publisher properties covered by this product. Buyers fetch actual property definitions from each publisher's adagents.json and validate agent authorization. Selection patterns mirror the authorization patterns in adagents.json for consistency.",
|
|
199
218
|
min_length=1,
|
|
200
219
|
),
|
|
201
220
|
]
|
|
202
221
|
reporting_capabilities: reporting_capabilities_1.ReportingCapabilities | None = None
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
@model_validator(mode='after')
|
|
206
|
-
def validate_publisher_properties_items(self) -> 'Product':
|
|
207
|
-
"""Validate all publisher_properties items."""
|
|
208
|
-
from adcp.validation import validate_product
|
|
209
|
-
|
|
210
|
-
data = self.model_dump()
|
|
211
|
-
validate_product(data)
|
|
212
|
-
return self
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: promoted-offerings.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T04:34:42+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ from typing import Annotated, Any
|
|
|
10
10
|
from adcp.types.base import AdCPBaseModel
|
|
11
11
|
from pydantic import AnyUrl, ConfigDict, Field
|
|
12
12
|
|
|
13
|
-
from . import
|
|
13
|
+
from . import brand_manifest as brand_manifest_1
|
|
14
14
|
from . import promoted_products
|
|
15
15
|
|
|
16
16
|
|
adcp/types/stable.py
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Stable public API for AdCP types.
|
|
2
|
+
|
|
3
|
+
This module provides a stable, versioned API that shields users from internal
|
|
4
|
+
implementation details and schema evolution. All types exported here are
|
|
5
|
+
guaranteed to be stable within a major version.
|
|
6
|
+
|
|
7
|
+
Internal Implementation:
|
|
8
|
+
- Types are generated from JSON schemas into adcp.types.generated_poc
|
|
9
|
+
- The generator may create numbered variants (e.g., BrandManifest1, BrandManifest2)
|
|
10
|
+
when schema evolution creates multiple valid structures
|
|
11
|
+
- This module provides clean, unnumbered aliases pointing to the canonical version
|
|
12
|
+
|
|
13
|
+
**IMPORTANT**: Never import directly from adcp.types.generated_poc or adcp.types.generated.
|
|
14
|
+
Always import from adcp.types or adcp.types.stable.
|
|
15
|
+
|
|
16
|
+
Schema Evolution:
|
|
17
|
+
- When schemas change, we update the alias targets here
|
|
18
|
+
- Users see stable names (BrandManifest, Product, etc.)
|
|
19
|
+
- Breaking changes require major version bumps
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from adcp.types._generated import (
|
|
25
|
+
# Core request/response types
|
|
26
|
+
ActivateSignalRequest,
|
|
27
|
+
ActivateSignalResponse,
|
|
28
|
+
# Assets
|
|
29
|
+
AudioAsset,
|
|
30
|
+
# Core domain types
|
|
31
|
+
BrandManifest, # Clean single type after upstream schema fix
|
|
32
|
+
BuildCreativeRequest,
|
|
33
|
+
BuildCreativeResponse,
|
|
34
|
+
# Pricing options
|
|
35
|
+
CpcPricingOption,
|
|
36
|
+
CpcvPricingOption,
|
|
37
|
+
CpmAuctionPricingOption,
|
|
38
|
+
CpmFixedRatePricingOption,
|
|
39
|
+
CppPricingOption,
|
|
40
|
+
CpvPricingOption,
|
|
41
|
+
CreateMediaBuyRequest,
|
|
42
|
+
CreateMediaBuyResponse,
|
|
43
|
+
Creative,
|
|
44
|
+
CreativeManifest,
|
|
45
|
+
# Enums and constants
|
|
46
|
+
CreativeStatus,
|
|
47
|
+
CssAsset,
|
|
48
|
+
Error,
|
|
49
|
+
FlatRatePricingOption,
|
|
50
|
+
Format,
|
|
51
|
+
GetMediaBuyDeliveryRequest,
|
|
52
|
+
GetMediaBuyDeliveryResponse,
|
|
53
|
+
GetProductsRequest,
|
|
54
|
+
GetProductsResponse,
|
|
55
|
+
GetSignalsRequest,
|
|
56
|
+
GetSignalsResponse,
|
|
57
|
+
HtmlAsset,
|
|
58
|
+
ImageAsset,
|
|
59
|
+
JavascriptAsset,
|
|
60
|
+
ListAuthorizedPropertiesRequest,
|
|
61
|
+
ListAuthorizedPropertiesResponse,
|
|
62
|
+
ListCreativeFormatsRequest,
|
|
63
|
+
ListCreativeFormatsResponse,
|
|
64
|
+
ListCreativesRequest,
|
|
65
|
+
ListCreativesResponse,
|
|
66
|
+
MarkdownAsset,
|
|
67
|
+
MediaBuy,
|
|
68
|
+
MediaBuyStatus,
|
|
69
|
+
PackageStatus,
|
|
70
|
+
PreviewCreativeRequest,
|
|
71
|
+
PreviewCreativeResponse,
|
|
72
|
+
PricingModel,
|
|
73
|
+
Product,
|
|
74
|
+
Property,
|
|
75
|
+
ProvidePerformanceFeedbackRequest,
|
|
76
|
+
ProvidePerformanceFeedbackResponse,
|
|
77
|
+
SyncCreativesRequest,
|
|
78
|
+
SyncCreativesResponse,
|
|
79
|
+
TasksGetRequest,
|
|
80
|
+
TasksGetResponse,
|
|
81
|
+
TasksListRequest,
|
|
82
|
+
TasksListResponse,
|
|
83
|
+
TaskStatus,
|
|
84
|
+
TaskType,
|
|
85
|
+
TextAsset,
|
|
86
|
+
UpdateMediaBuyRequest,
|
|
87
|
+
UpdateMediaBuyResponse,
|
|
88
|
+
UrlAsset,
|
|
89
|
+
VcpmAuctionPricingOption,
|
|
90
|
+
VcpmFixedRatePricingOption,
|
|
91
|
+
VideoAsset,
|
|
92
|
+
WebhookAsset,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# Import all generated types from internal consolidated module
|
|
96
|
+
# Import Package directly from its module to avoid collision with Response Package
|
|
97
|
+
from adcp.types.generated_poc.package import Package
|
|
98
|
+
|
|
99
|
+
# Note: BrandManifest is currently split into BrandManifest1/2 due to upstream schema
|
|
100
|
+
# using anyOf incorrectly. This will be fixed upstream to create a single BrandManifest type.
|
|
101
|
+
# For now, users should use BrandManifest1 (url required) which is most common.
|
|
102
|
+
|
|
103
|
+
# Note: BrandManifest is now a single clean type
|
|
104
|
+
# Re-export BrandManifest directly (no alias needed)
|
|
105
|
+
|
|
106
|
+
# Re-export all stable types
|
|
107
|
+
__all__ = [
|
|
108
|
+
# Request/Response types
|
|
109
|
+
"ActivateSignalRequest",
|
|
110
|
+
"ActivateSignalResponse",
|
|
111
|
+
"BuildCreativeRequest",
|
|
112
|
+
"BuildCreativeResponse",
|
|
113
|
+
"CreateMediaBuyRequest",
|
|
114
|
+
"CreateMediaBuyResponse",
|
|
115
|
+
"GetMediaBuyDeliveryRequest",
|
|
116
|
+
"GetMediaBuyDeliveryResponse",
|
|
117
|
+
"GetProductsRequest",
|
|
118
|
+
"GetProductsResponse",
|
|
119
|
+
"GetSignalsRequest",
|
|
120
|
+
"GetSignalsResponse",
|
|
121
|
+
"ListAuthorizedPropertiesRequest",
|
|
122
|
+
"ListAuthorizedPropertiesResponse",
|
|
123
|
+
"ListCreativeFormatsRequest",
|
|
124
|
+
"ListCreativeFormatsResponse",
|
|
125
|
+
"ListCreativesRequest",
|
|
126
|
+
"ListCreativesResponse",
|
|
127
|
+
"PreviewCreativeRequest",
|
|
128
|
+
"PreviewCreativeResponse",
|
|
129
|
+
"ProvidePerformanceFeedbackRequest",
|
|
130
|
+
"ProvidePerformanceFeedbackResponse",
|
|
131
|
+
"SyncCreativesRequest",
|
|
132
|
+
"SyncCreativesResponse",
|
|
133
|
+
"TasksGetRequest",
|
|
134
|
+
"TasksGetResponse",
|
|
135
|
+
"TasksListRequest",
|
|
136
|
+
"TasksListResponse",
|
|
137
|
+
"UpdateMediaBuyRequest",
|
|
138
|
+
"UpdateMediaBuyResponse",
|
|
139
|
+
# Domain types
|
|
140
|
+
"BrandManifest", # Stable alias for BrandManifest1 (temporary until upstream fix)
|
|
141
|
+
"Creative",
|
|
142
|
+
"CreativeManifest",
|
|
143
|
+
"Error",
|
|
144
|
+
"Format",
|
|
145
|
+
"MediaBuy",
|
|
146
|
+
"Package",
|
|
147
|
+
"Product",
|
|
148
|
+
"Property",
|
|
149
|
+
# Pricing options
|
|
150
|
+
"CpcPricingOption",
|
|
151
|
+
"CpcvPricingOption",
|
|
152
|
+
"CpmAuctionPricingOption",
|
|
153
|
+
"CpmFixedRatePricingOption",
|
|
154
|
+
"CppPricingOption",
|
|
155
|
+
"CpvPricingOption",
|
|
156
|
+
"FlatRatePricingOption",
|
|
157
|
+
"VcpmAuctionPricingOption",
|
|
158
|
+
"VcpmFixedRatePricingOption",
|
|
159
|
+
# Status enums
|
|
160
|
+
"CreativeStatus",
|
|
161
|
+
"MediaBuyStatus",
|
|
162
|
+
"PackageStatus",
|
|
163
|
+
"PricingModel",
|
|
164
|
+
"TaskStatus",
|
|
165
|
+
"TaskType",
|
|
166
|
+
# Assets
|
|
167
|
+
"AudioAsset",
|
|
168
|
+
"CssAsset",
|
|
169
|
+
"HtmlAsset",
|
|
170
|
+
"ImageAsset",
|
|
171
|
+
"JavascriptAsset",
|
|
172
|
+
"MarkdownAsset",
|
|
173
|
+
"TextAsset",
|
|
174
|
+
"UrlAsset",
|
|
175
|
+
"VideoAsset",
|
|
176
|
+
"WebhookAsset",
|
|
177
|
+
]
|
adcp/utils/preview_cache.py
CHANGED
|
@@ -10,7 +10,7 @@ from typing import TYPE_CHECKING, Any
|
|
|
10
10
|
|
|
11
11
|
if TYPE_CHECKING:
|
|
12
12
|
from adcp.client import ADCPClient
|
|
13
|
-
from adcp.types.
|
|
13
|
+
from adcp.types._generated import CreativeManifest, Format, FormatId, Product
|
|
14
14
|
|
|
15
15
|
logger = logging.getLogger(__name__)
|
|
16
16
|
|
|
@@ -67,7 +67,7 @@ class PreviewURLGenerator:
|
|
|
67
67
|
Returns:
|
|
68
68
|
Preview data with preview_url and metadata, or None if generation fails
|
|
69
69
|
"""
|
|
70
|
-
from adcp.types.
|
|
70
|
+
from adcp.types._generated import PreviewCreativeRequest1
|
|
71
71
|
|
|
72
72
|
cache_key = _make_manifest_cache_key(format_id, manifest.model_dump(exclude_none=True))
|
|
73
73
|
|
|
@@ -123,7 +123,7 @@ class PreviewURLGenerator:
|
|
|
123
123
|
Returns:
|
|
124
124
|
List of preview data dicts (or None for failures), in same order as requests
|
|
125
125
|
"""
|
|
126
|
-
from adcp.types.
|
|
126
|
+
from adcp.types._generated import PreviewCreativeRequest
|
|
127
127
|
|
|
128
128
|
if not requests:
|
|
129
129
|
return []
|
|
@@ -396,7 +396,7 @@ def _create_sample_manifest_for_format(fmt: Format) -> CreativeManifest | None:
|
|
|
396
396
|
Returns:
|
|
397
397
|
Sample CreativeManifest, or None if unable to create one
|
|
398
398
|
"""
|
|
399
|
-
from adcp.types.
|
|
399
|
+
from adcp.types._generated import CreativeManifest
|
|
400
400
|
|
|
401
401
|
if not fmt.assets_required:
|
|
402
402
|
return None
|
|
@@ -436,7 +436,7 @@ def _create_sample_manifest_for_format_id(
|
|
|
436
436
|
Returns:
|
|
437
437
|
Sample CreativeManifest with placeholder assets
|
|
438
438
|
"""
|
|
439
|
-
from adcp.types.
|
|
439
|
+
from adcp.types._generated import CreativeManifest, ImageAsset, UrlAsset
|
|
440
440
|
|
|
441
441
|
assets = {
|
|
442
442
|
"primary_asset": ImageAsset(url="https://example.com/sample-image.jpg"),
|
|
@@ -456,7 +456,7 @@ def _create_sample_asset(asset_type: str | None) -> Any:
|
|
|
456
456
|
Returns:
|
|
457
457
|
Sample asset object (Pydantic model)
|
|
458
458
|
"""
|
|
459
|
-
from adcp.types.
|
|
459
|
+
from adcp.types._generated import (
|
|
460
460
|
HtmlAsset,
|
|
461
461
|
ImageAsset,
|
|
462
462
|
TextAsset,
|