diff --git a/generate_models.sh b/generate_models.sh index e4917a6..a45543c 100755 --- a/generate_models.sh +++ b/generate_models.sh @@ -81,8 +81,8 @@ uv run \ --enum-field-as-literal all \ --disable-timestamp \ --use-double-quotes \ - --no-use-annotated \ --allow-extra-fields \ + --use-type-alias \ --custom-template-dir templates \ --additional-imports pydantic.ConfigDict diff --git a/pyproject.toml b/pyproject.toml index 00ff05c..d7c5286 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ucp-sdk" -version = "0.4.1" +version = "0.4.2" description = "UCP Python SDK" readme = "README.md" license = {file = "LICENSE"} diff --git a/src/ucp_sdk/models/schemas/capability.py b/src/ucp_sdk/models/schemas/capability.py index 06c378c..475e6dd 100644 --- a/src/ucp_sdk/models/schemas/capability.py +++ b/src/ucp_sdk/models/schemas/capability.py @@ -18,134 +18,128 @@ from __future__ import annotations -from typing import Any - -from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel - - -class UcpCapability(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="UCP Capability") - """ - Schema for UCP capabilities and extensions. Extensions are capabilities with an 'extends' field. Uses reverse-domain naming for governance. - """ - - -class Extends(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Extends1Item(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - - -class Extends1(RootModel[list[Extends1Item]]): - model_config = ConfigDict( - frozen=True, - ) - root: list[Extends1Item] = Field(..., min_length=1) - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Extends2(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Extends3Item(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - - -class Extends3(RootModel[list[Extends3Item]]): - model_config = ConfigDict( - frozen=True, - ) - root: list[Extends3Item] = Field(..., min_length=1) - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Extends4(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Extends5Item(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - - -class Extends5(RootModel[list[Extends5Item]]): - model_config = ConfigDict( - frozen=True, - ) - root: list[Extends5Item] = Field(..., min_length=1) - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Extends6(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Extends7Item(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") - - -class Extends7(RootModel[list[Extends7Item]]): - model_config = ConfigDict( - frozen=True, - ) - root: list[Extends7Item] = Field(..., min_length=1) - """ - Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. - """ - - -class Version(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any +from typing import Annotated, Any + +from pydantic import AnyUrl, BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType + +UcpCapability = TypeAliasType( + "UcpCapability", Annotated[Any, Field(..., title="UCP Capability")] +) +""" +Schema for UCP capabilities and extensions. Extensions are capabilities with an 'extends' field. Uses reverse-domain naming for governance. +""" + + +Extends = TypeAliasType( + "Extends", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Extends1Item = TypeAliasType( + "Extends1Item", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) + + +Extends1 = TypeAliasType( + "Extends1", Annotated[list[Extends1Item], Field(..., min_length=1)] +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Extends2 = TypeAliasType( + "Extends2", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Extends3Item = TypeAliasType( + "Extends3Item", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) + + +Extends3 = TypeAliasType( + "Extends3", Annotated[list[Extends3Item], Field(..., min_length=1)] +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Extends4 = TypeAliasType( + "Extends4", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Extends5Item = TypeAliasType( + "Extends5Item", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) + + +Extends5 = TypeAliasType( + "Extends5", Annotated[list[Extends5Item], Field(..., min_length=1)] +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Extends6 = TypeAliasType( + "Extends6", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Extends7Item = TypeAliasType( + "Extends7Item", + Annotated[ + str, Field(..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$") + ], +) + + +Extends7 = TypeAliasType( + "Extends7", Annotated[list[Extends7Item], Field(..., min_length=1)] +) +""" +Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions. +""" + + +Version = TypeAliasType("Version", Any) class Base(BaseModel): diff --git a/src/ucp_sdk/models/schemas/common/identity_linking.py b/src/ucp_sdk/models/schemas/common/identity_linking.py index a01449c..5b32ea4 100644 --- a/src/ucp_sdk/models/schemas/common/identity_linking.py +++ b/src/ucp_sdk/models/schemas/common/identity_linking.py @@ -18,21 +18,19 @@ from __future__ import annotations -from typing import Any +from typing import Annotated, Any -from pydantic import BaseModel, ConfigDict, Field, RootModel +from pydantic import BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from ..shopping.types import description as description_1 - -class IdentityLinking(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="Identity Linking") - """ - Capability schema for identity linking. Businesses declare the user-authenticated scopes they offer in a flat 'scopes' map. Each key is the OAuth scope string as it appears on the wire ('{capability}:{scope}', e.g. 'dev.ucp.shopping.order:read'). Scope presence implies that the corresponding operations require user authentication. Operations not gated by any listed scope operate at whatever access level the business permits; UCP does not prescribe a default. - """ +IdentityLinking = TypeAliasType( + "IdentityLinking", Annotated[Any, Field(..., title="Identity Linking")] +) +""" +Capability schema for identity linking. Businesses declare the user-authenticated scopes they offer in a flat 'scopes' map. Each key is the OAuth scope string as it appears on the wire ('{capability}:{scope}', e.g. 'dev.ucp.shopping.order:read'). Scope presence implies that the corresponding operations require user authentication. Operations not gated by any listed scope operate at whatever access level the business permits; UCP does not prescribe a default. +""" class ScopePolicy(BaseModel): @@ -49,20 +47,19 @@ class ScopePolicy(BaseModel): """ -class ScopeToken(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+:[a-z][a-z0-9_]*$" - ) - """ - OAuth scope string formed by joining a capability name and a scope name with a colon: '{capability}:{scope}', e.g. 'dev.ucp.shopping.order:read'. Capability names use reverse-DNS naming; scope names denote the permission granted, defined by each capability's spec (e.g. 'read', 'manage', 'create'). Platforms request these strings verbatim in OAuth 'scope' parameters; issued tokens carry them in the 'scope' claim. - """ +ScopeToken = TypeAliasType( + "ScopeToken", + Annotated[ + str, + Field( + ..., + pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+:[a-z][a-z0-9_]*$", + ), + ], +) +""" +OAuth scope string formed by joining a capability name and a scope name with a colon: '{capability}:{scope}', e.g. 'dev.ucp.shopping.order:read'. Capability names use reverse-DNS naming; scope names denote the permission granted, defined by each capability's spec (e.g. 'read', 'manage', 'create'). Platforms request these strings verbatim in OAuth 'scope' parameters; issued tokens carry them in the 'scope' claim. +""" -class IdentityLinking1(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any +IdentityLinking1 = TypeAliasType("IdentityLinking1", Any) diff --git a/src/ucp_sdk/models/schemas/payment_handler.py b/src/ucp_sdk/models/schemas/payment_handler.py index 1e3d4e5..cb36177 100644 --- a/src/ucp_sdk/models/schemas/payment_handler.py +++ b/src/ucp_sdk/models/schemas/payment_handler.py @@ -18,28 +18,22 @@ from __future__ import annotations -from typing import Any +from typing import Annotated, Any -from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel +from pydantic import AnyUrl, BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from .shopping.types import available_payment_instrument +PaymentHandler = TypeAliasType( + "PaymentHandler", Annotated[Any, Field(..., title="Payment Handler")] +) +""" +Schema for UCP payment handlers. Handlers define how payment instruments are processed. +""" -class PaymentHandler(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="Payment Handler") - """ - Schema for UCP payment handlers. Handlers define how payment instruments are processed. - """ - -class Version(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any +Version = TypeAliasType("Version", Any) class Base(BaseModel): diff --git a/src/ucp_sdk/models/schemas/service.py b/src/ucp_sdk/models/schemas/service.py index 16cb667..efe34c7 100644 --- a/src/ucp_sdk/models/schemas/service.py +++ b/src/ucp_sdk/models/schemas/service.py @@ -18,19 +18,17 @@ from __future__ import annotations -from typing import Any, Literal +from typing import Annotated, Any, Literal -from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel +from pydantic import AnyUrl, BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType - -class UcpService(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="UCP Service") - """ - Service binding for a specific transport. Each transport binding is a separate entry in the service array. - """ +UcpService = TypeAliasType( + "UcpService", Annotated[Any, Field(..., title="UCP Service")] +) +""" +Service binding for a specific transport. Each transport binding is a separate entry in the service array. +""" class Config(BaseModel): @@ -51,11 +49,7 @@ class Config(BaseModel): """ -class Version(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any +Version = TypeAliasType("Version", Any) class Base(BaseModel): @@ -244,20 +238,16 @@ class PlatformSchema9(BaseModel): """ -class PlatformSchema5( - RootModel[ - PlatformSchema | PlatformSchema7 | PlatformSchema8 | PlatformSchema9 - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( - PlatformSchema | PlatformSchema7 | PlatformSchema8 | PlatformSchema9 - ) = Field(..., title="Service (Platform Schema)") - """ - Full service declaration for platform-level discovery. All transports require `version`, `spec`, and `transport`. REST, MCP, and embedded additionally require `schema`. - """ +PlatformSchema5 = TypeAliasType( + "PlatformSchema5", + Annotated[ + PlatformSchema | PlatformSchema7 | PlatformSchema8 | PlatformSchema9, + Field(..., title="Service (Platform Schema)"), + ], +) +""" +Full service declaration for platform-level discovery. All transports require `version`, `spec`, and `transport`. REST, MCP, and embedded additionally require `schema`. +""" class BusinessSchema(BaseModel): @@ -412,20 +402,16 @@ class BusinessSchema6(BaseModel): """ -class BusinessSchema2( - RootModel[ - BusinessSchema | BusinessSchema4 | BusinessSchema5 | BusinessSchema6 - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( - BusinessSchema | BusinessSchema4 | BusinessSchema5 | BusinessSchema6 - ) = Field(..., title="Service (Business Schema)") - """ - Service binding for business/merchant configuration. May override platform endpoints. - """ +BusinessSchema2 = TypeAliasType( + "BusinessSchema2", + Annotated[ + BusinessSchema | BusinessSchema4 | BusinessSchema5 | BusinessSchema6, + Field(..., title="Service (Business Schema)"), + ], +) +""" +Service binding for business/merchant configuration. May override platform endpoints. +""" class ResponseSchema(BaseModel): @@ -580,17 +566,13 @@ class ResponseSchema6(BaseModel): """ -class ResponseSchema2( - RootModel[ - ResponseSchema | ResponseSchema4 | ResponseSchema5 | ResponseSchema6 - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( - ResponseSchema | ResponseSchema4 | ResponseSchema5 | ResponseSchema6 - ) = Field(..., title="Service (Response Schema)") - """ - Service binding in API responses. Includes per-resource transport configuration via typed config. - """ +ResponseSchema2 = TypeAliasType( + "ResponseSchema2", + Annotated[ + ResponseSchema | ResponseSchema4 | ResponseSchema5 | ResponseSchema6, + Field(..., title="Service (Response Schema)"), + ], +) +""" +Service binding in API responses. Includes per-resource transport configuration via typed config. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/ap2_mandate.py b/src/ucp_sdk/models/schemas/shopping/ap2_mandate.py index e14fa1a..49b65ba 100644 --- a/src/ucp_sdk/models/schemas/shopping/ap2_mandate.py +++ b/src/ucp_sdk/models/schemas/shopping/ap2_mandate.py @@ -18,49 +18,52 @@ from __future__ import annotations -from typing import Any, Literal +from typing import Annotated, Any, Literal -from pydantic import BaseModel, ConfigDict, Field, RootModel +from pydantic import BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from .checkout import Checkout as Checkout_1 - -class Ap2MandateExtension(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="AP2 Mandate Extension") - """ - Extends Checkout with cryptographic mandate support for non-repudiable authorization per the AP2 protocol. Uses embedded signature model with ap2 namespace. - """ - - -class MerchantAuthorization(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - pattern="^[A-Za-z0-9_-]+\\.\\.[A-Za-z0-9_-]+$", - title="Merchant Authorization", - ) - """ - JWS Detached Content signature (RFC 7515 Appendix F) over the checkout response body (excluding ap2 field). Format: `..`. The header MUST contain 'alg' (ES256/ES384/ES512) and 'kid' claims. The signature covers both the header and JCS-canonicalized checkout payload. - """ - - -class CheckoutMandate(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - pattern="^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]*\\.[A-Za-z0-9_-]+(~[A-Za-z0-9_-]+)*$", - title="Checkout Mandate", - ) - """ - SD-JWT+kb credential in `ap2.checkout_mandate`. Proving user authorization for the checkout. Contains the full checkout including `ap2.merchant_authorization`. - """ +Ap2MandateExtension = TypeAliasType( + "Ap2MandateExtension", + Annotated[Any, Field(..., title="AP2 Mandate Extension")], +) +""" +Extends Checkout with cryptographic mandate support for non-repudiable authorization per the AP2 protocol. Uses embedded signature model with ap2 namespace. +""" + + +MerchantAuthorization = TypeAliasType( + "MerchantAuthorization", + Annotated[ + str, + Field( + ..., + pattern="^[A-Za-z0-9_-]+\\.\\.[A-Za-z0-9_-]+$", + title="Merchant Authorization", + ), + ], +) +""" +JWS Detached Content signature (RFC 7515 Appendix F) over the checkout response body (excluding ap2 field). Format: `..`. The header MUST contain 'alg' (ES256/ES384/ES512) and 'kid' claims. The signature covers both the header and JCS-canonicalized checkout payload. +""" + + +CheckoutMandate = TypeAliasType( + "CheckoutMandate", + Annotated[ + str, + Field( + ..., + pattern="^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]*\\.[A-Za-z0-9_-]+(~[A-Za-z0-9_-]+)*$", + title="Checkout Mandate", + ), + ], +) +""" +SD-JWT+kb credential in `ap2.checkout_mandate`. Proving user authorization for the checkout. Contains the full checkout including `ap2.merchant_authorization`. +""" class Ap2WithMerchantAuthorization(BaseModel): @@ -91,8 +94,9 @@ class Ap2WithCheckoutMandate(BaseModel): """ -class ErrorCode( - RootModel[ +ErrorCode = TypeAliasType( + "ErrorCode", + Annotated[ Literal[ "mandate_required", "agent_missing_key", @@ -101,24 +105,13 @@ class ErrorCode( "mandate_scope_mismatch", "merchant_authorization_invalid", "merchant_authorization_missing", - ] - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: Literal[ - "mandate_required", - "agent_missing_key", - "mandate_invalid_signature", - "mandate_expired", - "mandate_scope_mismatch", - "merchant_authorization_invalid", - "merchant_authorization_missing", - ] = Field(..., title="AP2 Error Code") - """ - Error codes specific to AP2 mandate verification. - """ + ], + Field(..., title="AP2 Error Code"), + ], +) +""" +Error codes specific to AP2 mandate verification. +""" class Ap2(BaseModel): diff --git a/src/ucp_sdk/models/schemas/shopping/buyer_consent.py b/src/ucp_sdk/models/schemas/shopping/buyer_consent.py index 4162d93..830a810 100644 --- a/src/ucp_sdk/models/schemas/shopping/buyer_consent.py +++ b/src/ucp_sdk/models/schemas/shopping/buyer_consent.py @@ -18,22 +18,21 @@ from __future__ import annotations -from typing import Any +from typing import Annotated, Any -from pydantic import BaseModel, ConfigDict, Field, RootModel +from pydantic import BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from .checkout import Checkout as Checkout_1 from .types.buyer import Buyer as Buyer_1 - -class BuyerConsentExtension(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="Buyer Consent Extension") - """ - Extends Checkout with buyer consent tracking for privacy compliance via the buyer object. - """ +BuyerConsentExtension = TypeAliasType( + "BuyerConsentExtension", + Annotated[Any, Field(..., title="Buyer Consent Extension")], +) +""" +Extends Checkout with buyer consent tracking for privacy compliance via the buyer object. +""" class Consent(BaseModel): diff --git a/src/ucp_sdk/models/schemas/shopping/discount.py b/src/ucp_sdk/models/schemas/shopping/discount.py index fc355f1..f0121ee 100644 --- a/src/ucp_sdk/models/schemas/shopping/discount.py +++ b/src/ucp_sdk/models/schemas/shopping/discount.py @@ -18,24 +18,22 @@ from __future__ import annotations -from typing import Any, Literal +from typing import Annotated, Any, Literal -from pydantic import BaseModel, ConfigDict, Field, RootModel +from pydantic import BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from .cart import Cart as Cart_1 from .checkout import Checkout as Checkout_1 from .types import amount as amount_1 from .types import reverse_domain_name - -class DiscountExtension(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="Discount Extension") - """ - Extends Cart and Checkout with discount support, including discount codes, automatic discounts, and eligibility-triggered provisional discounts. - """ +DiscountExtension = TypeAliasType( + "DiscountExtension", Annotated[Any, Field(..., title="Discount Extension")] +) +""" +Extends Cart and Checkout with discount support, including discount codes, automatic discounts, and eligibility-triggered provisional discounts. +""" class Allocation(BaseModel): diff --git a/src/ucp_sdk/models/schemas/shopping/fulfillment.py b/src/ucp_sdk/models/schemas/shopping/fulfillment.py index 8b34540..fd919f5 100644 --- a/src/ucp_sdk/models/schemas/shopping/fulfillment.py +++ b/src/ucp_sdk/models/schemas/shopping/fulfillment.py @@ -18,9 +18,10 @@ from __future__ import annotations -from typing import Any +from typing import Annotated, Any -from pydantic import ConfigDict, Field, RootModel +from pydantic import ConfigDict, Field +from typing_extensions import TypeAliasType from .checkout import Checkout as Checkout_1 from .types import fulfillment as fulfillment_1 @@ -31,59 +32,40 @@ fulfillment_option, ) +FulfillmentExtension = TypeAliasType( + "FulfillmentExtension", + Annotated[Any, Field(..., title="Fulfillment Extension")], +) +""" +Extends Checkout with fulfillment support using methods, destinations, and groups. +""" -class FulfillmentExtension(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any = Field(..., title="Fulfillment Extension") - """ - Extends Checkout with fulfillment support using methods, destinations, and groups. - """ - -class DevUcpShoppingFulfillment(RootModel[Any]): - model_config = ConfigDict( - frozen=True, - ) - root: Any +DevUcpShoppingFulfillment = TypeAliasType("DevUcpShoppingFulfillment", Any) -class FulfillmentAvailableMethod( - RootModel[fulfillment_available_method.FulfillmentAvailableMethod] -): - model_config = ConfigDict( - frozen=True, - ) - root: fulfillment_available_method.FulfillmentAvailableMethod +FulfillmentAvailableMethod = TypeAliasType( + "FulfillmentAvailableMethod", + fulfillment_available_method.FulfillmentAvailableMethod, +) -class FulfillmentOption(RootModel[fulfillment_option.FulfillmentOption]): - model_config = ConfigDict( - frozen=True, - ) - root: fulfillment_option.FulfillmentOption +FulfillmentOption = TypeAliasType( + "FulfillmentOption", fulfillment_option.FulfillmentOption +) -class FulfillmentGroup(RootModel[fulfillment_group.FulfillmentGroup]): - model_config = ConfigDict( - frozen=True, - ) - root: fulfillment_group.FulfillmentGroup +FulfillmentGroup = TypeAliasType( + "FulfillmentGroup", fulfillment_group.FulfillmentGroup +) -class FulfillmentMethod(RootModel[fulfillment_method.FulfillmentMethod]): - model_config = ConfigDict( - frozen=True, - ) - root: fulfillment_method.FulfillmentMethod +FulfillmentMethod = TypeAliasType( + "FulfillmentMethod", fulfillment_method.FulfillmentMethod +) -class Fulfillment(RootModel[fulfillment_1.Fulfillment]): - model_config = ConfigDict( - frozen=True, - ) - root: fulfillment_1.Fulfillment +Fulfillment = TypeAliasType("Fulfillment", fulfillment_1.Fulfillment) class Checkout(Checkout_1): diff --git a/src/ucp_sdk/models/schemas/shopping/types/amount.py b/src/ucp_sdk/models/schemas/shopping/types/amount.py index ac8c453..0715e52 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/amount.py +++ b/src/ucp_sdk/models/schemas/shopping/types/amount.py @@ -18,14 +18,14 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class Amount(RootModel[int]): - model_config = ConfigDict( - frozen=True, - ) - root: int = Field(..., ge=0, title="Amount") - """ - Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD). - """ +Amount = TypeAliasType( + "Amount", Annotated[int, Field(..., ge=0, title="Amount")] +) +""" +Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD). +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/attribution.py b/src/ucp_sdk/models/schemas/shopping/types/attribution.py index 070ac62..82c0051 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/attribution.py +++ b/src/ucp_sdk/models/schemas/shopping/types/attribution.py @@ -18,18 +18,9 @@ from __future__ import annotations -from pydantic import ConfigDict, RootModel +from typing_extensions import TypeAliasType - -class Attribution(RootModel[dict[str, str]]): - """ - Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. - """ - - model_config = ConfigDict( - frozen=True, - ) - root: dict[str, str] - """ - URL-style parameter value, encoded as a string. Numeric or boolean values MUST be string-encoded as they would be in a URL query string. - """ +Attribution = TypeAliasType("Attribution", dict[str, str]) +""" +Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/attribution_complete_request.py b/src/ucp_sdk/models/schemas/shopping/types/attribution_complete_request.py index 40f5325..48d4694 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/attribution_complete_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/attribution_complete_request.py @@ -18,18 +18,11 @@ from __future__ import annotations -from pydantic import ConfigDict, RootModel +from typing_extensions import TypeAliasType - -class AttributionCompleteRequest(RootModel[dict[str, str]]): - """ - Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. - """ - - model_config = ConfigDict( - frozen=True, - ) - root: dict[str, str] - """ - URL-style parameter value, encoded as a string. Numeric or boolean values MUST be string-encoded as they would be in a URL query string. - """ +AttributionCompleteRequest = TypeAliasType( + "AttributionCompleteRequest", dict[str, str] +) +""" +Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/attribution_create_request.py b/src/ucp_sdk/models/schemas/shopping/types/attribution_create_request.py index 29150c2..0c4b537 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/attribution_create_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/attribution_create_request.py @@ -18,18 +18,11 @@ from __future__ import annotations -from pydantic import ConfigDict, RootModel +from typing_extensions import TypeAliasType - -class AttributionCreateRequest(RootModel[dict[str, str]]): - """ - Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. - """ - - model_config = ConfigDict( - frozen=True, - ) - root: dict[str, str] - """ - URL-style parameter value, encoded as a string. Numeric or boolean values MUST be string-encoded as they would be in a URL query string. - """ +AttributionCreateRequest = TypeAliasType( + "AttributionCreateRequest", dict[str, str] +) +""" +Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/attribution_update_request.py b/src/ucp_sdk/models/schemas/shopping/types/attribution_update_request.py index 7a60578..d19b78b 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/attribution_update_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/attribution_update_request.py @@ -18,18 +18,11 @@ from __future__ import annotations -from pydantic import ConfigDict, RootModel +from typing_extensions import TypeAliasType - -class AttributionUpdateRequest(RootModel[dict[str, str]]): - """ - Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. - """ - - model_config = ConfigDict( - frozen=True, - ) - root: dict[str, str] - """ - URL-style parameter value, encoded as a string. Numeric or boolean values MUST be string-encoded as they would be in a URL query string. - """ +AttributionUpdateRequest = TypeAliasType( + "AttributionUpdateRequest", dict[str, str] +) +""" +Platform-emitted referral and conversion-event context — campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/error_code.py b/src/ucp_sdk/models/schemas/shopping/types/error_code.py index f89c82b..346ac0c 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/error_code.py +++ b/src/ucp_sdk/models/schemas/shopping/types/error_code.py @@ -18,27 +18,31 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class ErrorCode(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - examples=[ - "not_found", - "out_of_stock", - "item_unavailable", - "address_undeliverable", - "payment_failed", - "eligibility_invalid", - "identity_required", - "insufficient_scope", - ], - title="Error Code", - ) - """ - Error code identifying the type of error. Standard errors are defined in specification (see examples), and have standardized semantics; freeform codes are permitted. - """ +ErrorCode = TypeAliasType( + "ErrorCode", + Annotated[ + str, + Field( + ..., + examples=[ + "not_found", + "out_of_stock", + "item_unavailable", + "address_undeliverable", + "payment_failed", + "eligibility_invalid", + "identity_required", + "insufficient_scope", + ], + title="Error Code", + ), + ], +) +""" +Error code identifying the type of error. Standard errors are defined in specification (see examples), and have standardized semantics; freeform codes are permitted. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination.py b/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination.py index f6232ff..b26f3e3 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination.py +++ b/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination.py @@ -18,24 +18,21 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated -from . import retail_location, shipping_destination +from pydantic import Field +from typing_extensions import TypeAliasType +from . import retail_location, shipping_destination -class FulfillmentDestination( - RootModel[ - shipping_destination.ShippingDestination - | retail_location.RetailLocation - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +FulfillmentDestination = TypeAliasType( + "FulfillmentDestination", + Annotated[ shipping_destination.ShippingDestination - | retail_location.RetailLocation - ) = Field(..., title="Fulfillment Destination") - """ - A destination for fulfillment. - """ + | retail_location.RetailLocation, + Field(..., title="Fulfillment Destination"), + ], +) +""" +A destination for fulfillment. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_create_request.py b/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_create_request.py index bb6f986..2eeb290 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_create_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_create_request.py @@ -18,24 +18,21 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated -from . import retail_location, shipping_destination +from pydantic import Field +from typing_extensions import TypeAliasType +from . import retail_location, shipping_destination -class FulfillmentDestinationCreateRequest( - RootModel[ - shipping_destination.ShippingDestination - | retail_location.RetailLocation - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +FulfillmentDestinationCreateRequest = TypeAliasType( + "FulfillmentDestinationCreateRequest", + Annotated[ shipping_destination.ShippingDestination - | retail_location.RetailLocation - ) = Field(..., title="Fulfillment Destination Create Request") - """ - A destination for fulfillment. - """ + | retail_location.RetailLocation, + Field(..., title="Fulfillment Destination Create Request"), + ], +) +""" +A destination for fulfillment. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_update_request.py b/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_update_request.py index 4bcc34c..e04ace3 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_update_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/fulfillment_destination_update_request.py @@ -18,24 +18,21 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated -from . import retail_location, shipping_destination +from pydantic import Field +from typing_extensions import TypeAliasType +from . import retail_location, shipping_destination -class FulfillmentDestinationUpdateRequest( - RootModel[ - shipping_destination.ShippingDestination - | retail_location.RetailLocation - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +FulfillmentDestinationUpdateRequest = TypeAliasType( + "FulfillmentDestinationUpdateRequest", + Annotated[ shipping_destination.ShippingDestination - | retail_location.RetailLocation - ) = Field(..., title="Fulfillment Destination Update Request") - """ - A destination for fulfillment. - """ + | retail_location.RetailLocation, + Field(..., title="Fulfillment Destination Update Request"), + ], +) +""" +A destination for fulfillment. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/info_code.py b/src/ucp_sdk/models/schemas/shopping/types/info_code.py index 4681856..a06eb3f 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/info_code.py +++ b/src/ucp_sdk/models/schemas/shopping/types/info_code.py @@ -18,18 +18,27 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class InfoCode(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - examples=["identity_optional", "signal", "free_shipping", "not_found"], - title="Info Code", - ) - """ - Info code identifying the type of informational message. Standard codes are defined in capability specs (see examples), and have standardized semantics; freeform codes are permitted. - """ +InfoCode = TypeAliasType( + "InfoCode", + Annotated[ + str, + Field( + ..., + examples=[ + "identity_optional", + "signal", + "free_shipping", + "not_found", + ], + title="Info Code", + ), + ], +) +""" +Info code identifying the type of informational message. Standard codes are defined in capability specs (see examples), and have standardized semantics; freeform codes are permitted. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/message.py b/src/ucp_sdk/models/schemas/shopping/types/message.py index 051eef2..65e20cc 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/message.py +++ b/src/ucp_sdk/models/schemas/shopping/types/message.py @@ -18,26 +18,22 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated -from . import message_error, message_info, message_warning +from pydantic import Field +from typing_extensions import TypeAliasType +from . import message_error, message_info, message_warning -class Message( - RootModel[ - message_error.MessageError - | message_warning.MessageWarning - | message_info.MessageInfo - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +Message = TypeAliasType( + "Message", + Annotated[ message_error.MessageError | message_warning.MessageWarning - | message_info.MessageInfo - ) = Field(..., title="Message") - """ - Container for error, warning, or info messages. - """ + | message_info.MessageInfo, + Field(..., title="Message"), + ], +) +""" +Container for error, warning, or info messages. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/message_create_request.py b/src/ucp_sdk/models/schemas/shopping/types/message_create_request.py index 531d331..3fa159b 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/message_create_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/message_create_request.py @@ -18,26 +18,22 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated -from . import message_error, message_info, message_warning +from pydantic import Field +from typing_extensions import TypeAliasType +from . import message_error, message_info, message_warning -class MessageCreateRequest( - RootModel[ - message_error.MessageError - | message_warning.MessageWarning - | message_info.MessageInfo - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +MessageCreateRequest = TypeAliasType( + "MessageCreateRequest", + Annotated[ message_error.MessageError | message_warning.MessageWarning - | message_info.MessageInfo - ) = Field(..., title="Message Create Request") - """ - Container for error, warning, or info messages. - """ + | message_info.MessageInfo, + Field(..., title="Message Create Request"), + ], +) +""" +Container for error, warning, or info messages. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/message_update_request.py b/src/ucp_sdk/models/schemas/shopping/types/message_update_request.py index 66831d9..7a86d1f 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/message_update_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/message_update_request.py @@ -18,26 +18,22 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated -from . import message_error, message_info, message_warning +from pydantic import Field +from typing_extensions import TypeAliasType +from . import message_error, message_info, message_warning -class MessageUpdateRequest( - RootModel[ - message_error.MessageError - | message_warning.MessageWarning - | message_info.MessageInfo - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +MessageUpdateRequest = TypeAliasType( + "MessageUpdateRequest", + Annotated[ message_error.MessageError | message_warning.MessageWarning - | message_info.MessageInfo - ) = Field(..., title="Message Update Request") - """ - Container for error, warning, or info messages. - """ + | message_info.MessageInfo, + Field(..., title="Message Update Request"), + ], +) +""" +Container for error, warning, or info messages. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name.py b/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name.py index 7bb3f46..3905247 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name.py +++ b/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name.py @@ -18,18 +18,22 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class ReverseDomainName(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$", - title="Reverse Domain Name", - ) - """ - Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). - """ +ReverseDomainName = TypeAliasType( + "ReverseDomainName", + Annotated[ + str, + Field( + ..., + pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$", + title="Reverse Domain Name", + ), + ], +) +""" +Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_create_request.py b/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_create_request.py index d748408..01bec46 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_create_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_create_request.py @@ -18,18 +18,22 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class ReverseDomainNameCreateRequest(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$", - title="Reverse Domain Name Create Request", - ) - """ - Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). - """ +ReverseDomainNameCreateRequest = TypeAliasType( + "ReverseDomainNameCreateRequest", + Annotated[ + str, + Field( + ..., + pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$", + title="Reverse Domain Name Create Request", + ), + ], +) +""" +Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_update_request.py b/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_update_request.py index 8f95bf4..613ed16 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_update_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/reverse_domain_name_update_request.py @@ -18,18 +18,22 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class ReverseDomainNameUpdateRequest(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$", - title="Reverse Domain Name Update Request", - ) - """ - Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). - """ +ReverseDomainNameUpdateRequest = TypeAliasType( + "ReverseDomainNameUpdateRequest", + Annotated[ + str, + Field( + ..., + pattern="^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$", + title="Reverse Domain Name Update Request", + ), + ], +) +""" +Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/signed_amount.py b/src/ucp_sdk/models/schemas/shopping/types/signed_amount.py index 3ee19e1..481b1c2 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/signed_amount.py +++ b/src/ucp_sdk/models/schemas/shopping/types/signed_amount.py @@ -18,14 +18,14 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class SignedAmount(RootModel[int]): - model_config = ConfigDict( - frozen=True, - ) - root: int = Field(..., title="Signed Amount") - """ - Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD). May be negative — the sign is intrinsic to the value (e.g., discounts are negative, charges are positive). - """ +SignedAmount = TypeAliasType( + "SignedAmount", Annotated[int, Field(..., title="Signed Amount")] +) +""" +Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD). May be negative — the sign is intrinsic to the value (e.g., discounts are negative, charges are positive). +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/totals.py b/src/ucp_sdk/models/schemas/shopping/types/totals.py index 0374f4b..6fff28d 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/totals.py +++ b/src/ucp_sdk/models/schemas/shopping/types/totals.py @@ -18,7 +18,10 @@ from __future__ import annotations -from pydantic import BaseModel, ConfigDict, Field, RootModel +from typing import Annotated + +from pydantic import BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from . import signed_amount from .total import Total as Total_1 @@ -49,15 +52,9 @@ class Total(Total_1): """ -class Totals(RootModel[list[Total]]): - """ - Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. - """ - - model_config = ConfigDict( - frozen=True, - ) - root: list[Total] = Field(..., title="Totals") - """ - Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. - """ +Totals = TypeAliasType( + "Totals", Annotated[list[Total], Field(..., title="Totals")] +) +""" +Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/totals_create_request.py b/src/ucp_sdk/models/schemas/shopping/types/totals_create_request.py index a4823e1..6530e8c 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/totals_create_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/totals_create_request.py @@ -18,7 +18,10 @@ from __future__ import annotations -from pydantic import BaseModel, ConfigDict, Field, RootModel +from typing import Annotated + +from pydantic import BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from . import signed_amount from .total import Total @@ -59,19 +62,13 @@ class TotalsCreateRequest1(BaseModel): ) -class TotalsCreateRequest( - RootModel[list[TotalsCreateRequestItem] | TotalsCreateRequest1] -): - """ - Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. - """ - - model_config = ConfigDict( - frozen=True, - ) - root: list[TotalsCreateRequestItem] | TotalsCreateRequest1 = Field( - ..., title="Totals Create Request" - ) - """ - Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. - """ +TotalsCreateRequest = TypeAliasType( + "TotalsCreateRequest", + Annotated[ + list[TotalsCreateRequestItem] | TotalsCreateRequest1, + Field(..., title="Totals Create Request"), + ], +) +""" +Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/totals_update_request.py b/src/ucp_sdk/models/schemas/shopping/types/totals_update_request.py index 9617727..58251b2 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/totals_update_request.py +++ b/src/ucp_sdk/models/schemas/shopping/types/totals_update_request.py @@ -18,7 +18,10 @@ from __future__ import annotations -from pydantic import BaseModel, ConfigDict, Field, RootModel +from typing import Annotated + +from pydantic import BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from . import signed_amount from .total import Total @@ -59,19 +62,13 @@ class TotalsUpdateRequest1(BaseModel): ) -class TotalsUpdateRequest( - RootModel[list[TotalsUpdateRequestItem] | TotalsUpdateRequest1] -): - """ - Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. - """ - - model_config = ConfigDict( - frozen=True, - ) - root: list[TotalsUpdateRequestItem] | TotalsUpdateRequest1 = Field( - ..., title="Totals Update Request" - ) - """ - Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. - """ +TotalsUpdateRequest = TypeAliasType( + "TotalsUpdateRequest", + Annotated[ + list[TotalsUpdateRequestItem] | TotalsUpdateRequest1, + Field(..., title="Totals Update Request"), + ], +) +""" +Pricing breakdown provided by the business. MUST contain exactly one subtotal and one total entry. Detail types (tax, fee, discount, fulfillment) may appear multiple times for itemization. Platforms MUST render all entries in order using display_text and amount. +""" diff --git a/src/ucp_sdk/models/schemas/shopping/types/warning_code.py b/src/ucp_sdk/models/schemas/shopping/types/warning_code.py index 3637513..753a9ca 100644 --- a/src/ucp_sdk/models/schemas/shopping/types/warning_code.py +++ b/src/ucp_sdk/models/schemas/shopping/types/warning_code.py @@ -18,23 +18,27 @@ from __future__ import annotations -from pydantic import ConfigDict, Field, RootModel +from typing import Annotated +from pydantic import Field +from typing_extensions import TypeAliasType -class WarningCode(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field( - ..., - examples=[ - "final_sale", - "prop65", - "fulfillment_changed", - "age_restricted", - ], - title="Warning Code", - ) - """ - Warning code identifying the type of warning. Standard codes are defined in capability specs (see examples), and have standardized semantics; freeform codes are permitted. - """ +WarningCode = TypeAliasType( + "WarningCode", + Annotated[ + str, + Field( + ..., + examples=[ + "final_sale", + "prop65", + "fulfillment_changed", + "age_restricted", + ], + title="Warning Code", + ), + ], +) +""" +Warning code identifying the type of warning. Standard codes are defined in capability specs (see examples), and have standardized semantics; freeform codes are permitted. +""" diff --git a/src/ucp_sdk/models/schemas/ucp.py b/src/ucp_sdk/models/schemas/ucp.py index c0b2652..4e8b977 100644 --- a/src/ucp_sdk/models/schemas/ucp.py +++ b/src/ucp_sdk/models/schemas/ucp.py @@ -18,22 +18,20 @@ from __future__ import annotations -from typing import Any, Literal +from typing import Annotated, Any, Literal -from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel +from pydantic import AnyUrl, BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from . import capability, payment_handler, service from .shopping.types import reverse_domain_name - -class Version(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^\\d{4}-\\d{2}-\\d{2}$") - """ - UCP version in YYYY-MM-DD format. - """ +Version = TypeAliasType( + "Version", Annotated[str, Field(..., pattern="^\\d{4}-\\d{2}-\\d{2}$")] +) +""" +UCP version in YYYY-MM-DD format. +""" class VersionConstraint(BaseModel): @@ -333,25 +331,17 @@ class ResponseCatalogSchema(Base): """ -class UcpMetadata( - RootModel[ - PlatformSchema - | BusinessSchema - | ResponseCheckoutSchema - | ResponseOrderSchema - | ResponseCartSchema - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +UcpMetadata = TypeAliasType( + "UcpMetadata", + Annotated[ PlatformSchema | BusinessSchema | ResponseCheckoutSchema | ResponseOrderSchema - | ResponseCartSchema - ) = Field(..., title="UCP Metadata") - """ - Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields. - """ + | ResponseCartSchema, + Field(..., title="UCP Metadata"), + ], +) +""" +Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields. +""" diff --git a/src/ucp_sdk/models/schemas/ucp_create_request.py b/src/ucp_sdk/models/schemas/ucp_create_request.py index 90bcba7..5f68cf8 100644 --- a/src/ucp_sdk/models/schemas/ucp_create_request.py +++ b/src/ucp_sdk/models/schemas/ucp_create_request.py @@ -18,22 +18,20 @@ from __future__ import annotations -from typing import Any, Literal +from typing import Annotated, Any, Literal -from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel +from pydantic import AnyUrl, BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from . import capability, payment_handler, service from .shopping.types import reverse_domain_name - -class Version(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^\\d{4}-\\d{2}-\\d{2}$") - """ - UCP version in YYYY-MM-DD format. - """ +Version = TypeAliasType( + "Version", Annotated[str, Field(..., pattern="^\\d{4}-\\d{2}-\\d{2}$")] +) +""" +UCP version in YYYY-MM-DD format. +""" class VersionConstraint(BaseModel): @@ -333,25 +331,17 @@ class ResponseCatalogSchema(Base): """ -class UcpMetadataCreateRequest( - RootModel[ - PlatformSchema - | BusinessSchema - | ResponseCheckoutSchema - | ResponseOrderSchema - | ResponseCartSchema - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +UcpMetadataCreateRequest = TypeAliasType( + "UcpMetadataCreateRequest", + Annotated[ PlatformSchema | BusinessSchema | ResponseCheckoutSchema | ResponseOrderSchema - | ResponseCartSchema - ) = Field(..., title="UCP Metadata Create Request") - """ - Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields. - """ + | ResponseCartSchema, + Field(..., title="UCP Metadata Create Request"), + ], +) +""" +Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields. +""" diff --git a/src/ucp_sdk/models/schemas/ucp_update_request.py b/src/ucp_sdk/models/schemas/ucp_update_request.py index 9279a1a..57cf54c 100644 --- a/src/ucp_sdk/models/schemas/ucp_update_request.py +++ b/src/ucp_sdk/models/schemas/ucp_update_request.py @@ -18,22 +18,20 @@ from __future__ import annotations -from typing import Any, Literal +from typing import Annotated, Any, Literal -from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel +from pydantic import AnyUrl, BaseModel, ConfigDict, Field +from typing_extensions import TypeAliasType from . import capability, payment_handler, service from .shopping.types import reverse_domain_name - -class Version(RootModel[str]): - model_config = ConfigDict( - frozen=True, - ) - root: str = Field(..., pattern="^\\d{4}-\\d{2}-\\d{2}$") - """ - UCP version in YYYY-MM-DD format. - """ +Version = TypeAliasType( + "Version", Annotated[str, Field(..., pattern="^\\d{4}-\\d{2}-\\d{2}$")] +) +""" +UCP version in YYYY-MM-DD format. +""" class VersionConstraint(BaseModel): @@ -333,25 +331,17 @@ class ResponseCatalogSchema(Base): """ -class UcpMetadataUpdateRequest( - RootModel[ - PlatformSchema - | BusinessSchema - | ResponseCheckoutSchema - | ResponseOrderSchema - | ResponseCartSchema - ] -): - model_config = ConfigDict( - frozen=True, - ) - root: ( +UcpMetadataUpdateRequest = TypeAliasType( + "UcpMetadataUpdateRequest", + Annotated[ PlatformSchema | BusinessSchema | ResponseCheckoutSchema | ResponseOrderSchema - | ResponseCartSchema - ) = Field(..., title="UCP Metadata Update Request") - """ - Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields. - """ + | ResponseCartSchema, + Field(..., title="UCP Metadata Update Request"), + ], +) +""" +Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields. +"""