Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion generate_models.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"}
Expand Down
250 changes: 122 additions & 128 deletions src/ucp_sdk/models/schemas/capability.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
49 changes: 23 additions & 26 deletions src/ucp_sdk/models/schemas/common/identity_linking.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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)
26 changes: 10 additions & 16 deletions src/ucp_sdk/models/schemas/payment_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Loading
Loading