Skip to content

Commit 5545071

Browse files
bokelleyclaude
andauthored
feat: add create_media_buy, update_media_buy, and build_creative to SimpleAPI (#74)
The SimpleAPI was missing three methods that are available in the full ADCPClient: - create_media_buy: Create a new media buy reservation - update_media_buy: Update an existing media buy reservation - build_creative: Generate production-ready creative assets These methods follow the same pattern as other SimpleAPI methods: - Accept kwargs instead of typed request objects - Return unwrapped response data directly - Raise ADCPSimpleAPIError on failures - Include usage examples in docstrings Also updated test_simple_api_methods to verify all three new methods exist and are async functions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com>
1 parent be28a7f commit 5545071

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

src/adcp/simple.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
from adcp.types.stable import (
2727
ActivateSignalRequest,
2828
ActivateSignalResponse,
29+
BuildCreativeRequest,
30+
BuildCreativeResponse,
31+
CreateMediaBuyRequest,
32+
CreateMediaBuyResponse,
2933
GetMediaBuyDeliveryRequest,
3034
GetMediaBuyDeliveryResponse,
3135
GetProductsRequest,
@@ -44,6 +48,8 @@
4448
ProvidePerformanceFeedbackResponse,
4549
SyncCreativesRequest,
4650
SyncCreativesResponse,
51+
UpdateMediaBuyRequest,
52+
UpdateMediaBuyResponse,
4753
)
4854

4955
if TYPE_CHECKING:
@@ -345,3 +351,101 @@ async def provide_performance_feedback(
345351
agent_id=self._client.agent_config.id,
346352
)
347353
return result.data
354+
355+
async def create_media_buy(
356+
self,
357+
**kwargs: Any,
358+
) -> CreateMediaBuyResponse:
359+
"""Create media buy.
360+
361+
Args:
362+
**kwargs: Arguments passed to CreateMediaBuyRequest
363+
364+
Returns:
365+
CreateMediaBuyResponse
366+
367+
Raises:
368+
Exception: If the request fails
369+
370+
Example:
371+
media_buy = await client.simple.create_media_buy(
372+
brand_manifest=brand,
373+
packages=[package_request],
374+
publisher_properties=properties
375+
)
376+
print(f"Created media buy: {media_buy.media_buy_id}")
377+
"""
378+
request = CreateMediaBuyRequest(**kwargs)
379+
result = await self._client.create_media_buy(request)
380+
if not result.success or not result.data:
381+
raise ADCPSimpleAPIError(
382+
operation="create_media_buy",
383+
error_message=result.error,
384+
agent_id=self._client.agent_config.id,
385+
)
386+
return result.data
387+
388+
async def update_media_buy(
389+
self,
390+
**kwargs: Any,
391+
) -> UpdateMediaBuyResponse:
392+
"""Update media buy.
393+
394+
Args:
395+
**kwargs: Arguments passed to UpdateMediaBuyRequest
396+
397+
Returns:
398+
UpdateMediaBuyResponse
399+
400+
Raises:
401+
Exception: If the request fails
402+
403+
Example:
404+
updated = await client.simple.update_media_buy(
405+
media_buy_id="mb_123",
406+
packages=[updated_package]
407+
)
408+
print(f"Updated media buy: {updated.media_buy_id}")
409+
"""
410+
request = UpdateMediaBuyRequest(**kwargs)
411+
result = await self._client.update_media_buy(request)
412+
if not result.success or not result.data:
413+
raise ADCPSimpleAPIError(
414+
operation="update_media_buy",
415+
error_message=result.error,
416+
agent_id=self._client.agent_config.id,
417+
)
418+
return result.data
419+
420+
async def build_creative(
421+
self,
422+
**kwargs: Any,
423+
) -> BuildCreativeResponse:
424+
"""Build creative.
425+
426+
Args:
427+
**kwargs: Arguments passed to BuildCreativeRequest
428+
429+
Returns:
430+
BuildCreativeResponse
431+
432+
Raises:
433+
Exception: If the request fails
434+
435+
Example:
436+
creative = await client.simple.build_creative(
437+
manifest=creative_manifest,
438+
target_format_id="vast_2.0",
439+
inputs={"duration": 30}
440+
)
441+
print(f"Built creative: {creative.assets[0].url}")
442+
"""
443+
request = BuildCreativeRequest(**kwargs)
444+
result = await self._client.build_creative(request)
445+
if not result.success or not result.data:
446+
raise ADCPSimpleAPIError(
447+
operation="build_creative",
448+
error_message=result.error,
449+
agent_id=self._client.agent_config.id,
450+
)
451+
return result.data

tests/test_simple_api.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,15 @@ def test_simple_api_methods():
198198
assert hasattr(test_agent.simple, "get_signals")
199199
assert hasattr(test_agent.simple, "activate_signal")
200200
assert hasattr(test_agent.simple, "provide_performance_feedback")
201+
assert hasattr(test_agent.simple, "create_media_buy")
202+
assert hasattr(test_agent.simple, "update_media_buy")
203+
assert hasattr(test_agent.simple, "build_creative")
201204

202205
# Verify they're all async methods (not sync)
203206
import inspect
204207

205208
assert inspect.iscoroutinefunction(test_agent.simple.get_products)
206209
assert inspect.iscoroutinefunction(test_agent.simple.list_creative_formats)
210+
assert inspect.iscoroutinefunction(test_agent.simple.create_media_buy)
211+
assert inspect.iscoroutinefunction(test_agent.simple.update_media_buy)
212+
assert inspect.iscoroutinefunction(test_agent.simple.build_creative)

0 commit comments

Comments
 (0)