@@ -47,6 +47,57 @@ <h1 class="title">Module <code>adcp.capabilities</code></h1>
4747< section >
4848< h2 class ="section-title " id ="header-functions "> Functions</ h2 >
4949< dl >
50+ < dt id ="adcp.capabilities.build_synthetic_capabilities "> < code class ="name flex ">
51+ < span > def < span class ="ident "> build_synthetic_capabilities</ span > </ span > (< span > supported_protocols: list[str], *, major_versions: list[int] | None = None) ‑> dict[str, typing.Any]</ span >
52+ </ code > </ dt >
53+ < dd >
54+ < details class ="source ">
55+ < summary >
56+ < span > Expand source code</ span >
57+ </ summary >
58+ < pre > < code class ="python "> def build_synthetic_capabilities(
59+ supported_protocols: list[str],
60+ *,
61+ major_versions: list[int] | None = None,
62+ ) -> dict[str, Any]:
63+ """Build a synthetic capabilities response for pre-v3 sellers.
64+
65+ Use this when connecting to a seller that doesn't support
66+ ``get_adcp_capabilities`` (pre-v3 sellers). The returned dict
67+ can be passed to ``FeatureResolver`` after wrapping with the
68+ appropriate Pydantic model.
69+
70+ Args:
71+ supported_protocols: List of protocol domains the seller supports
72+ (e.g., ``["media_buy"]``).
73+ major_versions: ADCP major versions the seller supports.
74+ Defaults to ``[2]``.
75+
76+ Returns:
77+ A dict matching the GetAdcpCapabilitiesResponse shape.
78+ """
79+ return {
80+ "adcp": {"major_versions": major_versions or [2]},
81+ "supported_protocols": supported_protocols,
82+ }</ code > </ pre >
83+ </ details >
84+ < div class ="desc "> < p > Build a synthetic capabilities response for pre-v3 sellers.</ p >
85+ < p > Use this when connecting to a seller that doesn't support
86+ < code > get_adcp_capabilities</ code > (pre-v3 sellers). The returned dict
87+ can be passed to < code > < a title ="adcp.capabilities.FeatureResolver " href ="#adcp.capabilities.FeatureResolver "> FeatureResolver</ a > </ code > after wrapping with the
88+ appropriate Pydantic model.</ p >
89+ < h2 id ="args "> Args</ h2 >
90+ < dl >
91+ < dt > < strong > < code > supported_protocols</ code > </ strong > </ dt >
92+ < dd > List of protocol domains the seller supports
93+ (e.g., < code > ["media_buy"]</ code > ).</ dd >
94+ < dt > < strong > < code > major_versions</ code > </ strong > </ dt >
95+ < dd > ADCP major versions the seller supports.
96+ Defaults to < code > [2]</ code > .</ dd >
97+ </ dl >
98+ < h2 id ="returns "> Returns</ h2 >
99+ < p > A dict matching the GetAdcpCapabilitiesResponse shape.</ p > </ div >
100+ </ dd >
50101< dt id ="adcp.capabilities.validate_capabilities "> < code class ="name flex ">
51102< span > def < span class ="ident "> validate_capabilities</ span > </ span > (< span > handler: Any, capabilities: GetAdcpCapabilitiesResponse) ‑> list[str]</ span >
52103</ code > </ dt >
@@ -169,6 +220,19 @@ <h2 class="section-title" id="header-classes">Classes</h2>
169220 def capabilities(self) -> GetAdcpCapabilitiesResponse:
170221 return self._caps
171222
223+ def supports_v3(self) -> bool:
224+ """Check if the seller supports ADCP v3.
225+
226+ Returns:
227+ True if major_versions includes 3.
228+ """
229+ if self._caps.adcp is None:
230+ return False
231+ for v in self._caps.adcp.major_versions:
232+ if (v.root if hasattr(v, "root") else v) == 3:
233+ return True
234+ return False
235+
172236 def supports(self, feature: str) -> bool:
173237 """Check if a feature is supported."""
174238 caps = self._caps
@@ -472,6 +536,31 @@ <h2 id="raises">Raises</h2>
472536</ details >
473537< div class ="desc "> < p > Check if a feature is supported.</ p > </ div >
474538</ dd >
539+ < dt id ="adcp.capabilities.FeatureResolver.supports_v3 "> < code class ="name flex ">
540+ < span > def < span class ="ident "> supports_v3</ span > </ span > (< span > self) ‑> bool</ span >
541+ </ code > </ dt >
542+ < dd >
543+ < details class ="source ">
544+ < summary >
545+ < span > Expand source code</ span >
546+ </ summary >
547+ < pre > < code class ="python "> def supports_v3(self) -> bool:
548+ """Check if the seller supports ADCP v3.
549+
550+ Returns:
551+ True if major_versions includes 3.
552+ """
553+ if self._caps.adcp is None:
554+ return False
555+ for v in self._caps.adcp.major_versions:
556+ if (v.root if hasattr(v, "root") else v) == 3:
557+ return True
558+ return False</ code > </ pre >
559+ </ details >
560+ < div class ="desc "> < p > Check if the seller supports ADCP v3.</ p >
561+ < h2 id ="returns "> Returns</ h2 >
562+ < p > True if major_versions includes 3.</ p > </ div >
563+ </ dd >
475564</ dl >
476565</ dd >
477566</ dl >
@@ -489,6 +578,7 @@ <h2 id="raises">Raises</h2>
489578</ li >
490579< li > < h3 > < a href ="#header-functions "> Functions</ a > </ h3 >
491580< ul class ="">
581+ < li > < code > < a title ="adcp.capabilities.build_synthetic_capabilities " href ="#adcp.capabilities.build_synthetic_capabilities "> build_synthetic_capabilities</ a > </ code > </ li >
492582< li > < code > < a title ="adcp.capabilities.validate_capabilities " href ="#adcp.capabilities.validate_capabilities "> validate_capabilities</ a > </ code > </ li >
493583</ ul >
494584</ li >
@@ -501,6 +591,7 @@ <h4><code><a title="adcp.capabilities.FeatureResolver" href="#adcp.capabilities.
501591< li > < code > < a title ="adcp.capabilities.FeatureResolver.get_declared_features " href ="#adcp.capabilities.FeatureResolver.get_declared_features "> get_declared_features</ a > </ code > </ li >
502592< li > < code > < a title ="adcp.capabilities.FeatureResolver.require " href ="#adcp.capabilities.FeatureResolver.require "> require</ a > </ code > </ li >
503593< li > < code > < a title ="adcp.capabilities.FeatureResolver.supports " href ="#adcp.capabilities.FeatureResolver.supports "> supports</ a > </ code > </ li >
594+ < li > < code > < a title ="adcp.capabilities.FeatureResolver.supports_v3 " href ="#adcp.capabilities.FeatureResolver.supports_v3 "> supports_v3</ a > </ code > </ li >
504595</ ul >
505596</ li >
506597</ ul >
0 commit comments