diff --git a/.fern/metadata.json b/.fern/metadata.json
index 5363cfd..cb84d89 100644
--- a/.fern/metadata.json
+++ b/.fern/metadata.json
@@ -23,7 +23,7 @@
}
]
},
- "originGitCommit": "19cafdf92ab056ef6ba803bf1e352b0422a8ec45",
+ "originGitCommit": "86a4c45d14847babf70751d87de4da7764ecd894",
"originGitCommitIsDirty": false,
"invokedBy": "ci",
"requestedVersion": "1.3.0",
diff --git a/.fern/replay.lock b/.fern/replay.lock
index 02e46bf..21e716d 100644
--- a/.fern/replay.lock
+++ b/.fern/replay.lock
@@ -18,5 +18,11 @@ generations:
cli_version: unknown
generator_versions:
fernapi/fern-python-sdk: 5.14.20
-current_generation: ca6a39b4d1f47f2f893071f497458e78dea9b53a
+ - commit_sha: ad999e27e746bde5b21fd20be605a20b70595aca
+ tree_hash: d9caeaa278448e9cec1a53f370e1937f60f6c86b
+ timestamp: 2026-07-20T11:00:13.025Z
+ cli_version: unknown
+ generator_versions:
+ fernapi/fern-python-sdk: 5.14.20
+current_generation: ad999e27e746bde5b21fd20be605a20b70595aca
patches: []
diff --git a/poetry.lock b/poetry.lock
index 0eba3e4..88b9ca3 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,25 +1,26 @@
-# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.4.1 and should not be changed by hand.
[[package]]
name = "aiohappyeyeballs"
version = "2.7.1"
description = "Happy Eyeballs for asyncio"
-optional = false
+optional = true
python-versions = ">=3.10"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
{file = "aiohappyeyeballs-2.7.1-py3-none-any.whl", hash = "sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472"},
{file = "aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d"},
]
-markers = {main = "extra == \"aiohttp\""}
[[package]]
name = "aiohttp"
version = "3.14.1"
description = "Async http client/server framework (asyncio)"
-optional = false
+optional = true
python-versions = ">=3.10"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
{file = "aiohttp-3.14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f6bb621e5863cfe8fe5ff5468002d200ec31f30f1280b259dc505b02595099e"},
{file = "aiohttp-3.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f7215cb3933784f79ed20e5f050e15984f390424339b22375d5a53c933a0491"},
@@ -141,7 +142,6 @@ files = [
{file = "aiohttp-3.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:90d53f1609c29ccc2193945ef732428382a28f78d0456ae4d3daf0d48b74f0f6"},
{file = "aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035"},
]
-markers = {main = "extra == \"aiohttp\""}
[package.dependencies]
aiohappyeyeballs = ">=2.5.0"
@@ -161,14 +161,14 @@ speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\" and
name = "aiosignal"
version = "1.4.0"
description = "aiosignal: a list of registered asynchronous callbacks"
-optional = false
+optional = true
python-versions = ">=3.9"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
{file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"},
{file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"},
]
-markers = {main = "extra == \"aiohttp\""}
[package.dependencies]
frozenlist = ">=1.1.0"
@@ -210,27 +210,40 @@ trio = ["trio (>=0.32.0)"]
name = "async-timeout"
version = "5.0.1"
description = "Timeout context manager for asyncio programs"
-optional = false
+optional = true
python-versions = ">=3.8"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "python_version == \"3.10\" and extra == \"aiohttp\""
files = [
{file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"},
{file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"},
]
-markers = {main = "extra == \"aiohttp\" and python_version == \"3.10\"", dev = "python_full_version < \"3.11.3\""}
[[package]]
name = "attrs"
version = "26.1.0"
description = "Classes Without Boilerplate"
-optional = false
+optional = true
python-versions = ">=3.9"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
{file = "attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309"},
{file = "attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32"},
]
-markers = {main = "extra == \"aiohttp\""}
+
+[[package]]
+name = "backports-asyncio-runner"
+version = "1.2.0"
+description = "Backport of asyncio.Runner, a context manager that controls event loop life cycle."
+optional = false
+python-versions = "<3.11,>=3.8"
+groups = ["dev"]
+markers = "python_version == \"3.10\""
+files = [
+ {file = "backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5"},
+ {file = "backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162"},
+]
[[package]]
name = "certifi"
@@ -295,9 +308,10 @@ testing = ["hatch", "pre-commit", "pytest", "tox"]
name = "frozenlist"
version = "1.8.0"
description = "A list-like structure which implements collections.abc.MutableSequence"
-optional = false
+optional = true
python-versions = ">=3.9"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
{file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011"},
{file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565"},
@@ -430,7 +444,6 @@ files = [
{file = "frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d"},
{file = "frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad"},
]
-markers = {main = "extra == \"aiohttp\""}
[[package]]
name = "h11"
@@ -493,15 +506,15 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "httpx-aiohttp"
-version = "0.1.12"
+version = "0.1.8"
description = "Aiohttp transport for HTTPX"
optional = true
python-versions = ">=3.8"
groups = ["main"]
markers = "extra == \"aiohttp\""
files = [
- {file = "httpx_aiohttp-0.1.12-py3-none-any.whl", hash = "sha256:5b0eac39a7f360fa7867a60bcb46bb1024eada9c01cbfecdb54dc1edb3fb7141"},
- {file = "httpx_aiohttp-0.1.12.tar.gz", hash = "sha256:81feec51fd82c0ecfa0e9aaf1b1a6c2591260d5e2bcbeb7eb0277a78e610df2c"},
+ {file = "httpx_aiohttp-0.1.8-py3-none-any.whl", hash = "sha256:b7bd958d1331f3759a38a0ba22ad29832cb63ca69498c17735228055bf78fa7e"},
+ {file = "httpx_aiohttp-0.1.8.tar.gz", hash = "sha256:756c5e74cdb568c3248ba63fe82bfe8bbe64b928728720f7eaac64b3cf46f308"},
]
[package.dependencies]
@@ -514,7 +527,7 @@ version = "3.18"
description = "Internationalized Domain Names in Applications (IDNA)"
optional = false
python-versions = ">=3.9"
-groups = ["main", "dev"]
+groups = ["main"]
files = [
{file = "idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2"},
{file = "idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848"},
@@ -539,9 +552,10 @@ files = [
name = "multidict"
version = "6.7.1"
description = "multidict implementation"
-optional = false
+optional = true
python-versions = ">=3.9"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
{file = "multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5"},
{file = "multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8"},
@@ -690,7 +704,6 @@ files = [
{file = "multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56"},
{file = "multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d"},
]
-markers = {main = "extra == \"aiohttp\""}
[package.dependencies]
typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""}
@@ -793,9 +806,10 @@ testing = ["coverage", "pytest", "pytest-benchmark"]
name = "propcache"
version = "0.5.2"
description = "Accelerated property cache"
-optional = false
+optional = true
python-versions = ">=3.10"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
{file = "propcache-0.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a81be28596d6559f6131ef33e10200de6e17643b3c74ce03f9eb103be6ae8b"},
{file = "propcache-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29cbaac5ea0212663e6845e04b5e188d5a6ae6dd919810ac835bf1d3b42c3f4c"},
@@ -919,7 +933,6 @@ files = [
{file = "propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe"},
{file = "propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427"},
]
-markers = {main = "extra == \"aiohttp\""}
[[package]]
name = "pydantic"
@@ -1077,63 +1090,63 @@ files = [
typing-extensions = ">=4.14.1"
[[package]]
-name = "pyjwt"
-version = "2.13.0"
-description = "JSON Web Token implementation in Python"
+name = "pygments"
+version = "2.20.0"
+description = "Pygments is a syntax highlighting package written in Python."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728"},
- {file = "pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423"},
+ {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"},
+ {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"},
]
-[package.dependencies]
-typing_extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
-
[package.extras]
-crypto = ["cryptography (>=3.4.0)"]
+windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pytest"
-version = "7.4.4"
+version = "9.1.1"
description = "pytest: simple powerful testing with Python"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.10"
groups = ["dev"]
files = [
- {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
- {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
+ {file = "pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c"},
+ {file = "pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313"},
]
[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
-iniconfig = "*"
-packaging = "*"
-pluggy = ">=0.12,<2.0"
-tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
+colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""}
+iniconfig = ">=1.0.1"
+packaging = ">=22"
+pluggy = ">=1.5,<2"
+pygments = ">=2.7.2"
+tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
-testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-asyncio"
-version = "0.23.8"
+version = "1.4.0"
description = "Pytest support for asyncio"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.10"
groups = ["dev"]
files = [
- {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"},
- {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"},
+ {file = "pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1"},
+ {file = "pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42"},
]
[package.dependencies]
-pytest = ">=7.0.0,<9"
+backports-asyncio-runner = {version = ">=1.1,<2", markers = "python_version < \"3.11\""}
+pytest = ">=8.4,<10"
+typing-extensions = {version = ">=4.12", markers = "python_version < \"3.13\""}
[package.extras]
-docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"]
+docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)", "sphinx-tabs (>=3.5)"]
testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
[[package]]
@@ -1172,26 +1185,6 @@ files = [
[package.dependencies]
six = ">=1.5"
-[[package]]
-name = "redis"
-version = "5.3.1"
-description = "Python client for Redis database and key-value store"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "redis-5.3.1-py3-none-any.whl", hash = "sha256:dc1909bd24669cc31b5f67a039700b16ec30571096c5f1f0d9d2324bff31af97"},
- {file = "redis-5.3.1.tar.gz", hash = "sha256:ca49577a531ea64039b5a36db3d6cd1a0c7a60c34124d46924a45b956e8cf14c"},
-]
-
-[package.dependencies]
-async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""}
-PyJWT = ">=2.9.0"
-
-[package.extras]
-hiredis = ["hiredis (>=3.0.0)"]
-ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"]
-
[[package]]
name = "ruff"
version = "0.11.5"
@@ -1292,14 +1285,14 @@ files = [
[[package]]
name = "types-python-dateutil"
-version = "2.9.0.20260518"
+version = "2.9.0.20260716"
description = "Typing stubs for python-dateutil"
optional = false
python-versions = ">=3.10"
groups = ["dev"]
files = [
- {file = "types_python_dateutil-2.9.0.20260518-py3-none-any.whl", hash = "sha256:d6a9c5bd0de61460c8fdef8ab2b400f956a1a1075cce08d4e2b4434e478c50b8"},
- {file = "types_python_dateutil-2.9.0.20260518.tar.gz", hash = "sha256:51f02dc03b61c7f6a07df45797d4dfe8a1aa47f0b7db9ad89f6fd3a1a70e1b51"},
+ {file = "types_python_dateutil-2.9.0.20260716-py3-none-any.whl", hash = "sha256:1ae41d51a5c5f6bbeeb7f1f34df7086d55ff1605cf88d2ed71a7a276e1a7794e"},
+ {file = "types_python_dateutil-2.9.0.20260716.tar.gz", hash = "sha256:1d55d1c3024bdb4861bb6a6622c9ec800c433d87bdc5b16fb84cdd0eed4ef2cb"},
]
[[package]]
@@ -1330,265 +1323,137 @@ files = [
typing-extensions = ">=4.12.0"
[[package]]
-name = "wasmtime"
-version = "46.0.1"
-description = "A WebAssembly runtime powered by Wasmtime"
-optional = true
-python-versions = ">=3.9"
-groups = ["main"]
-markers = "extra == \"datastream\" or extra == \"rulesengine\""
+name = "urllib3"
+version = "2.7.0"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+optional = false
+python-versions = ">=3.10"
+groups = ["dev"]
files = [
- {file = "wasmtime-46.0.1-py3-none-android_26_arm64_v8a.whl", hash = "sha256:cc8d52f9ad3bedc1e4de5002f7b22d7cac400be046711d177f6ce20a11eacb31"},
- {file = "wasmtime-46.0.1-py3-none-android_26_x86_64.whl", hash = "sha256:f8e4b0ec402b84b856d3c6c2f96c6e6889c56e685b5cfed0a4040775c751ca38"},
- {file = "wasmtime-46.0.1-py3-none-any.whl", hash = "sha256:85a092a63c20ccecb965b9aa12a19368d2e06203436d19701068efc390efa678"},
- {file = "wasmtime-46.0.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:9b46c546bf73ece2600403db7dc604c3ef12046ccf2fabe07d7bfaa00453ce8b"},
- {file = "wasmtime-46.0.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:de1a69573a173b5171f9413bcf0b88f4fed2721ed02c842fc25de5358730ccdf"},
- {file = "wasmtime-46.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:e53c65abe31aeeb19a3f794b6e53140d401c4c79ad91c89caefdc502ee2b10c1"},
- {file = "wasmtime-46.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:841b53fc17eedabaa6deb1e062a04a0a8953908d540fadb4149bc55c3f6d3e50"},
- {file = "wasmtime-46.0.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f295d10012b6ca6ecffa7757eed70b84ebaa2e33dc39275e7b6bed5eed5130b9"},
- {file = "wasmtime-46.0.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:05fc65164b4825bf1c3c8f007df070b25accc974cb81d0bfc1c5d76fdf6f70e0"},
- {file = "wasmtime-46.0.1-py3-none-win_amd64.whl", hash = "sha256:559b0753e3ea311fd16000fe51c08592a625e61ebb8640601ae7173fc516e430"},
- {file = "wasmtime-46.0.1-py3-none-win_arm64.whl", hash = "sha256:967625406fde8fc3c9d795ffbb7bdde77d0a38de776e8eb7a0416ca6d811a27a"},
- {file = "wasmtime-46.0.1.tar.gz", hash = "sha256:0da0388c21bc0f0e633c7a30f2b7939a657f5019258c9a3a63fd37298a0dbb8b"},
+ {file = "urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"},
+ {file = "urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c"},
]
[package.extras]
-testing = ["coverage", "pycparser", "pytest", "pytest-mypy"]
-
-[[package]]
-name = "websockets"
-version = "16.1"
-description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
-optional = true
-python-versions = ">=3.10"
-groups = ["main"]
-markers = "extra == \"datastream\""
-files = [
- {file = "websockets-16.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de72a9c611178b15557d98eabd3101c9663c4d68938510478a6d162f99afd213"},
- {file = "websockets-16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:37b0e4d726ffea3776670092d3d13e1cb605076f036a695fd1259de0d9b9fe02"},
- {file = "websockets-16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:00d50c0a27098fcb7ab47b3d99a1b1159b534dbcd959fbf05113ebc37e5f927b"},
- {file = "websockets-16.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1acb698bff1da1782b31aebd8d7a24d7d05453964abcd7d03dbf6e25893908e8"},
- {file = "websockets-16.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc2c453f3b5f99c56b16e233aad5299860558487d26adb2ed27a00c14ca24b8c"},
- {file = "websockets-16.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1a9f08a0728b0835f1c6abe1d9b746ab3de49b7336a0e1919cf96be1e76273eb"},
- {file = "websockets-16.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a089979d6173b27af18026c8d8b0077f83669a9169174482c4651e9f5739a5b6"},
- {file = "websockets-16.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3c18dba232ec2b92a68579c9fed8ff5a18f853d1e09fc0b6ca3159e94f689fe"},
- {file = "websockets-16.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c1eb7df4170d5068892a8834fb5c07b9552353deb0dbeb0bff3820481ae4792"},
- {file = "websockets-16.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c522bd48e625b6d557aa228967258d6d3da031c4cc21d3352fb302479aa9ba0a"},
- {file = "websockets-16.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d106396927a7f00b0f3a69215c3357f87bf0bca6844247121f7e8291e826a3b1"},
- {file = "websockets-16.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d71bed12909b8039955536e192867d02d76cd3797cedfd0facf822e7668636c3"},
- {file = "websockets-16.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:9c1cf6f9a936b030b5bed0e800c5ee32069338129084546baf5ff5014dc62fa9"},
- {file = "websockets-16.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3fd3e6a7af2c8fcdcf4ffbeaf7f54a567b91a83267204187797f31faaa2a4efa"},
- {file = "websockets-16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dddd27175bf640acae5561fa79b77e8ec71fc445816200523e5c19b6a556fb72"},
- {file = "websockets-16.1-cp310-cp310-win32.whl", hash = "sha256:cce36c80b3f2fede7942f1756d3d885fa6fa086766c8c1bcf00695ab80f0d51a"},
- {file = "websockets-16.1-cp310-cp310-win_amd64.whl", hash = "sha256:115fc4695b94bb855995b23fb1abcb66099a5995575d3d5bc5605a616c58d0eb"},
- {file = "websockets-16.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9b1d7a63cba8e6b9b77e499a81eab29d31100298d090ad4507d1048c0b9cae0"},
- {file = "websockets-16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bedbc5efeb96621aa2921d2d92608246691399418cac22acba427eb11877ea1f"},
- {file = "websockets-16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd847ab82133015afe65d778e7966ab42dba16bd7ad2e5b8a7918db6539f3f94"},
- {file = "websockets-16.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2fb33ccb16ee40a95cc676d7b0ff451a9a2632f11a0dbc2e666326892b2e1de"},
- {file = "websockets-16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f15b6d9ea9c2eaf6ccab964a082b09bfa6634a495bb0c2e9e7ee6943f58976"},
- {file = "websockets-16.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:638cf57c48b4ad8ac1ff1e453f4f97db2426b690ddc111e6da96b27b4a340bc3"},
- {file = "websockets-16.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c1c85f61bc9d5eac57ce705d848dc2d2ce3680638300bf4e1da7d749e2cf4ce"},
- {file = "websockets-16.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:eeab6d27f51c7e579023c971f5e6dff200deadf01faf6831beaecd32052dfaef"},
- {file = "websockets-16.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2ed64e5a97b0b97a0b66e18bfe281317a75fbbd5afe692f939ea8d14a4292f2c"},
- {file = "websockets-16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b3b021d0ed4bc16eea9775f62c9fa71acdacba0fc790b38581754dedf29ca60"},
- {file = "websockets-16.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6eb604a4167f0a0d53c2243dfc667a29f0b43c3436057184e070bb82a1000fa2"},
- {file = "websockets-16.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9a3f125e44c3e34d61d111652e608e0f5b85ce08c225c8d56ad0eb822fa40030"},
- {file = "websockets-16.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8fdf0b00d0d1f30d1f06a92cab46fe542eec3eb302a7aee7163f142d0780f216"},
- {file = "websockets-16.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:67b56828712f5fa7852de4c0265c28827311a657a4d275b7312ed0d1a918bee4"},
- {file = "websockets-16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39c7e7730be33b8f0cd6f0aa8e8c82f9cdd1813f159765e073b2ece65f4824b5"},
- {file = "websockets-16.1-cp311-cp311-win32.whl", hash = "sha256:c54fe94fb2f11e11b48920c5f971e298cec73ac35db56efe57a49db63dfc95d4"},
- {file = "websockets-16.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9f4fb9ae8b802e55609685db98382d48fd3feb1397804e1e774968dea0f28c7"},
- {file = "websockets-16.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6aa3f7ad345cf3862c21f4fbf2ef5e14d911348476c2845e137c091fe3a3f0b"},
- {file = "websockets-16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b43fcfb521ac2f34ba80b7b8ea16303e4ad82dd8af667bf40839ad3a5d37b164"},
- {file = "websockets-16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bd3e12cd9afbe2baedae0b1eeade8ba64329b60fe2f9abdc966bd10fd2c2ef5"},
- {file = "websockets-16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f41979c8623df9bd30d949d82010a8fda5c56ff12cd8508a5b7272b6d4b53a"},
- {file = "websockets-16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24d1f35aef07d794a16c853c688e74956c50239bec37b4f2de080056046419b"},
- {file = "websockets-16.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c64c024ddf7a35331b21fcddb562a039c275d2c82e8c2d12939e7da23997270"},
- {file = "websockets-16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3e99757f5baafe20fc598e202ea6f5b0b265186ad38d0a17bd8beca16296955"},
- {file = "websockets-16.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353f3bc6e058ac1ccab4b3588e8598837a8c04cfc8351233e6d523be675d844c"},
- {file = "websockets-16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0352f5b38b40e857b6428d468fa21dbb4dd4a567d933c26d9831b4efe1b92f43"},
- {file = "websockets-16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70bd789afab579602968c39f21cb925466505f3edff22f0ae852bca54978a4f9"},
- {file = "websockets-16.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d0fb4b46f121eccd539353baebd1083a8767a9a351109453d1d1caecd1ba40c2"},
- {file = "websockets-16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c14b6634af01541e4efe2954fd8f263386f7aa6d37c01e55dd8109fd17661452"},
- {file = "websockets-16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a58532c49a851bcb481e58c1be23b315c17fe2fbbed509d75aeea12f543d2c15"},
- {file = "websockets-16.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4e969170c3b08e1d8dabd990fef1fa702c4233aeaabec33f871806e444f6a0e4"},
- {file = "websockets-16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff9b000064b88787ba9f7a3cb2af2b68a658ca5aad76458a46469e7124b678a0"},
- {file = "websockets-16.1-cp312-cp312-win32.whl", hash = "sha256:b9f5d83f80f4d7c4bba6d97f3755ac05850c784dce0fd2ab371c4e41172f53ff"},
- {file = "websockets-16.1-cp312-cp312-win_amd64.whl", hash = "sha256:6852c9f653966c16109d3b6f31181fd734f7914927e3f0fa1117af7a18c9aa21"},
- {file = "websockets-16.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b0232ed141cec3df2af5a3959a071c51f40036336b0d37e17faf9ef52fc73e47"},
- {file = "websockets-16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a71b73d143991714144e159f767b698f03c4a70b8a65ae1733b650cff488045b"},
- {file = "websockets-16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:187323204c3b2fc465e8fc2609e60437c521790cb9c1acb49c4c452a33e57f37"},
- {file = "websockets-16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dba74233c8c3ce368850818c98354dad2570f57231b3fd3bd00d7aa57628881"},
- {file = "websockets-16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63339bc8c63c86a463177775cb7c677691f5bcfac7b3b2f01b286d42acd41600"},
- {file = "websockets-16.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23e545ea8ae4263e37cdfd4e22a217f519e48e432728bc461185bbf585f38a83"},
- {file = "websockets-16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2237081454846fb40403a80ba86d82e2038b9c45865ab96af0abe7d002a91045"},
- {file = "websockets-16.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5f5218de1ed047385ca53744caba9435d65f75d008364970a3fae95a05812cf9"},
- {file = "websockets-16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75c98e3920039d0edff03b74478ada504b7ce3a1bc406db2cabfca84320f7baf"},
- {file = "websockets-16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1facd189d8190af30487a55b4c3688484dd50801628a3b5b2ccd26db08e67057"},
- {file = "websockets-16.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cc0c6a6eef613c7da32d4fb068f82ef834b58134f6a16b54e6c1e5bf9529ab3d"},
- {file = "websockets-16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ad9411eded8988b879be6038206698bf7106c85a78f642c004485bcb95be17eb"},
- {file = "websockets-16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cd68f0914f3b64694895bc5e9b14e8b447e41d7bf5ffaf989bb8dcb5e2dfdce7"},
- {file = "websockets-16.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fef2debfe7f7ebdda12176f26166f95b7af17af05ba06150fcf889032e0213e9"},
- {file = "websockets-16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3cd6c9b798218798f4bb7b2e71c38f0e744bb94ca537b13376f88019d46384d"},
- {file = "websockets-16.1-cp313-cp313-win32.whl", hash = "sha256:84c170c6869633536921e4474b1cce7254c0c9b0053ef5725f966cee47e718e4"},
- {file = "websockets-16.1-cp313-cp313-win_amd64.whl", hash = "sha256:bef52d327d70fa75dad93ee61ea2cb1d1489aca9f35c188833563f5a3b4df0a5"},
- {file = "websockets-16.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f881fca0a45dd6789939bd6637cd98169b92f1c3fdc78262f2cb9ec2cb1f324e"},
- {file = "websockets-16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c379d5b207d3a7f0ba4c2e4602a895b0bcc63fb5f5371a4ae7fbddb03b672b"},
- {file = "websockets-16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:98ab58a4faa72b46da0127ccc1931dcbfc0985b0778892300a092185910c4cbe"},
- {file = "websockets-16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e9c4e369fc181b2d41a99e01477215cecdc8546a39f7d41a59cc0a7065a0b09"},
- {file = "websockets-16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0704df094b2d5fa7f6f410925a594c2a5c9a09167731a76292e5410934208209"},
- {file = "websockets-16.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b22b1f4950f6ab7126623329c3b47b3b90a14c05db517f2db2a026ad6c928352"},
- {file = "websockets-16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1ae4a686a662964a6671069f84f7f908cc3475e782227726b0c622c715962105"},
- {file = "websockets-16.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:856bdd638f8277f86465057bfdd4da097c73058fb0f9d2bd5baea29e2bf2d367"},
- {file = "websockets-16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9003a1fde1c21a322a3ca3fa0c4bda8c639da81dbc925162766086643b05ba87"},
- {file = "websockets-16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e947b1f5fdab045174306e3916785bf3ed537648acc1549827c08c33b10953"},
- {file = "websockets-16.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5dd0e666b5931c0509cf65714686a1c5126771e663a79ac5d40da4f58b1f9502"},
- {file = "websockets-16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a0285df7925657ad65a65fb8dc330808bce082827538fd50ef45fa12d1fc5bca"},
- {file = "websockets-16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:82d1c2cab3c133e9d059b3a5420bed9376bd30e21c185c63dda4ddadf6ddda47"},
- {file = "websockets-16.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c39907f1eaf11f6277def65aa02d68f30576b693d0c1ca332aafa3caa723ac6d"},
- {file = "websockets-16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:45c5ea55446171949eb99fd34b771ceddd511ca21958d40d0197ced33159e5ee"},
- {file = "websockets-16.1-cp314-cp314-win32.whl", hash = "sha256:b8ef8b1c8d6bd029a475ac432e730fba2dfd456715d26c473e2a82291024b99c"},
- {file = "websockets-16.1-cp314-cp314-win_amd64.whl", hash = "sha256:7358ff21632b5d062707f73e859c824f1c3807e73d8ca25e71caca7c4cdcf145"},
- {file = "websockets-16.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d0f38f4c3e9b359e257c339c2cc1967ccaeedb102e57c1c986bdce4bf4f32268"},
- {file = "websockets-16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3c3d2cbd1602593bad49bd86fa3fbb25407d87a3b4bf8857c0ac5ac4914e1901"},
- {file = "websockets-16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:36069b74671e7e667f48a7484249f84c45a825a134c8b1bdc01875d0daa10d79"},
- {file = "websockets-16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:587f83c2ce8a5d628e166384d77fa7f0ac69b9007d515ab442123e6615aa8da3"},
- {file = "websockets-16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6db7972d52bc1b66cefe2246902e256cbaebc9ba8a45eac09343d7eb6671b2"},
- {file = "websockets-16.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e7d6014888a0632e1ed7a4095248bb3095232999447f2d83bfb1900987dd9ed9"},
- {file = "websockets-16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9cb074d150e4ad2a77aa8a332c2be85f3f64f2681519d2570c1225c12c9821ff"},
- {file = "websockets-16.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d19c9067e1fe9490f974bffbc0e443b80a7674c5efb4980c429cc00771f07c5a"},
- {file = "websockets-16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d440ff0c6c7469ad59c0a412c383c235935b43635e89425e3f6a0c36de90c31b"},
- {file = "websockets-16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8613129a2533f08de24505e69a3e403cedaadae49abdb043c4d170ca71b7e4bd"},
- {file = "websockets-16.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a5bf9c23f197b4ec88290fd5463f33db67362a1bb10f85fc2e8e7627f0ddab97"},
- {file = "websockets-16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:520b0fd0395f075febb283c76755af724ab9fd19dffa4f3bfd18cb4e622790a3"},
- {file = "websockets-16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7143aa09a67e1c013be44e81a88dfe90fc6244198ab86c7edd064152cf619805"},
- {file = "websockets-16.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:7acb811fad08e611755800d1560e395c67e11a6bd563598ea6abb319afb86938"},
- {file = "websockets-16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c5cf88e3faa2f7931bc6baeee7599c97656a3f6ac7f831f4fccba233e141783a"},
- {file = "websockets-16.1-cp314-cp314t-win32.whl", hash = "sha256:589f8842521c8307684ce0b40ce4ad70c5e0aa46484c6f1225a94ef4b8970341"},
- {file = "websockets-16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c0e0857c30bbbc2bb5c30687508f0b7ec19aa026cd9f2ff8424d0fee42dcc07"},
- {file = "websockets-16.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7289d899c79e763e6221c8dcb8959361cb43274418538d7c7ad16a43b01d12f9"},
- {file = "websockets-16.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e22e9e3719f5131bd62da4db63c8da63eb8c91cc99e16c1cbd122f130e1ae07a"},
- {file = "websockets-16.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:83bdabafef431247e6b11a9aab8a0893fd8e82e1ed95b32e0373625b03ffce4a"},
- {file = "websockets-16.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b8d13ceabc5c60995f201b5211d76876e17e68706ebf5d3bc666b32eefff1a6"},
- {file = "websockets-16.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81495f9c0085361c582efbc3207fb877174cfe03370f17d9cd70624404aa526f"},
- {file = "websockets-16.1-py3-none-any.whl", hash = "sha256:c5149dfe490ec7e5ee5dbf624c642fb725f93a5575c7f00ab594ca9eddb8dd81"},
- {file = "websockets-16.1.tar.gz", hash = "sha256:299468cbe42e2b9981134c7c51d99387d8a7bf562b00183b3eec53f882846dad"},
-]
+brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""]
+h2 = ["h2 (>=4,<5)"]
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
+zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""]
[[package]]
name = "yarl"
-version = "1.24.2"
+version = "1.24.5"
description = "Yet another URL library"
-optional = false
+optional = true
python-versions = ">=3.10"
-groups = ["main", "dev"]
+groups = ["main"]
+markers = "extra == \"aiohttp\""
files = [
- {file = "yarl-1.24.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5249a113065c2b7a958bc699759e359cd61cfc81e3069662208f48f191b7ed12"},
- {file = "yarl-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4425fa244fbf530b006d0c5f79ce920114cfff5b4f5f6056e669f8e160fdc0"},
- {file = "yarl-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15c0b5e49d3c44e2a0b93e6a49476c5edad0a7686b92c395765a7ea775572a75"},
- {file = "yarl-1.24.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:246d32a53a947c8f0189f5d699cbd4c7036de45d9359e13ba238d1239678c727"},
- {file = "yarl-1.24.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:64480fb3e4d4ed9ed71c48a91a477384fc342a50ca30071d2f8a88d51d9c9413"},
- {file = "yarl-1.24.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:349de4701dc3760b6e876628423a8f147ef4f5599d10aba1e10702075d424ed9"},
- {file = "yarl-1.24.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d162677af8d5d3d6ebab8394b021f4d041ac107a4b705873148a77a49dc9e1b2"},
- {file = "yarl-1.24.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5f5c6ec23a9043f2d139cc072f53dd23168d202a334b9b2fda8de4c3e890d90"},
- {file = "yarl-1.24.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:60de6742447fbbf697f16f070b8a443f1b5fe6ca3826fbef9fe70ecd5328e643"},
- {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acf93187c3710e422368eb768aee98db551ec7c85adc250207a95c16548ab7ac"},
- {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f4b0352fd41fd34b6651934606268816afd6914d09626f9bcbbf018edb0afb3f"},
- {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6b208bb939099b4b297438da4e9b25357f0b1c791888669b963e45b203ea9f36"},
- {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4b85b8825e631295ff4bc8943f7471d54c533a9360bbe15ebb38e018b555bb8a"},
- {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e26acf20c26cb4fefc631fdb75aca2a6b8fa8b7b5d7f204fb6a8f1e63c706f53"},
- {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:819ca24f8eafcfb683c1bd5f44f2f488cea1274eb8944731ffd2e1f10f619342"},
- {file = "yarl-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:5cb0f995a901c36be096ccbf4c673591c2faabbe96279598ffaec8c030f85bf4"},
- {file = "yarl-1.24.2-cp310-cp310-win_arm64.whl", hash = "sha256:f408eace7e22a68b467a0562e0d27d322f91fe3eaaa6f466b962c6cfaea9fa39"},
- {file = "yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1"},
- {file = "yarl-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a97e42c8a2233f2f279ecadd9e4a037bcb5d813b78435e8eedd4db5a9e9708c"},
- {file = "yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d"},
- {file = "yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae"},
- {file = "yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a"},
- {file = "yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e"},
- {file = "yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50"},
- {file = "yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003"},
- {file = "yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f"},
- {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f"},
- {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294"},
- {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2"},
- {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c"},
- {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b"},
- {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5"},
- {file = "yarl-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:f8fdbcff8b2c7c9284e60c196f693588598ddcee31e11c18e14949ce44519d45"},
- {file = "yarl-1.24.2-cp311-cp311-win_arm64.whl", hash = "sha256:b32c37a7a337e90822c45797bf3d79d60875cfcccd3ecc80e9f453d87026c122"},
- {file = "yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8"},
- {file = "yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2"},
- {file = "yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d"},
- {file = "yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035"},
- {file = "yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576"},
- {file = "yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8"},
- {file = "yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7"},
- {file = "yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c"},
- {file = "yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d"},
- {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db"},
- {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712"},
- {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996"},
- {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b"},
- {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c"},
- {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1"},
- {file = "yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad"},
- {file = "yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30"},
- {file = "yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536"},
- {file = "yarl-1.24.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e89418f65eda18f99030386305bd44d7d504e328a7945db1ead514fbe03a0607"},
- {file = "yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1"},
- {file = "yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986"},
- {file = "yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488"},
- {file = "yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b"},
- {file = "yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592"},
- {file = "yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617"},
- {file = "yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92"},
- {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a"},
- {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44"},
- {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a"},
- {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf"},
- {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056"},
- {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992"},
- {file = "yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656"},
- {file = "yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461"},
- {file = "yarl-1.24.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f9312b3c02d9b3d23840f67952913c9c8721d7f1b7db305289faefa878f364c2"},
- {file = "yarl-1.24.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a4f4d6cd615823bfc7fb7e9b5987c3f41666371d870d51058f77e2680fbe9630"},
- {file = "yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8"},
- {file = "yarl-1.24.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fecd17873a096036c1c87ab3486f1aef7f269ada7f23f7f856f93b1cc7744f14"},
- {file = "yarl-1.24.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a46d1ab4ba4d32e6dc80daf8a28ce0bd83d08df52fbc32f3e288663427734535"},
- {file = "yarl-1.24.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73e68edf6dfd5f73f9ca127d84e2a6f9213c65bdffb736bda19524c0564fcd14"},
- {file = "yarl-1.24.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a296ca617f2d25fbceafb962b88750d627e5984e75732c712154d058ae8d79a3"},
- {file = "yarl-1.24.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51b2cf5ec89a8b8470177641ed62a3ba22d74e1e898e06ad53aa77972487208"},
- {file = "yarl-1.24.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:310fc687f7b2044ec54e372c8cbe923bb88f5c37bded0d3079e5791c2fc3cf50"},
- {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:297a2fe352ecf858b30a98f87948746ec16f001d279f84aebdbd3bd965e2f1bd"},
- {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2a263e76b97bc42bdcd7c5f4953dec1f7cd62a1112fa7f869e57255229390d67"},
- {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:822519b64cf0b474f1a0aaef1dc621438ea46bb77c94df97a5b4d213a7d8a8b1"},
- {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b6067060d9dc594899ba83e6db6c48c68d1e494a6dab158156ed86977ca7bcb1"},
- {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0063adad533e57171b79db3943b229d40dfafeeee579767f96541f106bac5f1b"},
- {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ee8e3fb34513e8dc082b586ef4910c98335d43a6fab688cd44d4851bacfce3e8"},
- {file = "yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0"},
- {file = "yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57"},
- {file = "yarl-1.24.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:221ce1dd921ac4f603957f17d7c18c5cc0797fbb52f156941f92e04605d1d67b"},
- {file = "yarl-1.24.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5f3224db28173a00d7afacdee07045cc4673dfab2b15492c7ae10deddbece761"},
- {file = "yarl-1.24.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c557165320d6244ebe3a02431b2a201a20080e02f41f0cfa0ccc47a183765da8"},
- {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:904065e6e85b1fa54d0d87438bd58c14c0bad97aad654ad1077fd9d87e8478ed"},
- {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cec2a38d70edc10e0e856ceda886af5327a017ccbde8e1de1bd44d300357543"},
- {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7484b9361ed222ee1ca5b4337aa4cbdcc4618ce5aff57d9ef1582fd95893fc0"},
- {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:84f9670b89f34db07f81e53aee83e0b938a3412329d51c8f922488be7fcc4024"},
- {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abb2759733d63a28b4956500a5dd57140f26486c92b2caedfb964ab7d9b79dbf"},
- {file = "yarl-1.24.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:081c2bf54efe03774d0311172bc04fedf9ca01e644d4cd8c805688e527209bdc"},
- {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:86746bef442aa479107fe28132e1277237f9c24c2f00b0b0cf22b3ee0904f2bb"},
- {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2d07d21d0bc4b17558e8de0b02fbfdf1e347d3bb3699edd00bb92e7c57925420"},
- {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4fb1ac3fc5fecd8ae7453ea237e4d22b49befa70266dfe1629924245c21a0c7f"},
- {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4da31a5512ed1729ca8d8aacde3f7faeb8843cde3165d6bcf7f88f74f17bb8aa"},
- {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:533ded4dceb5f1f3da7906244f4e82cf46cfd40d84c69a1faf5ac506aa65ecbe"},
- {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7b3a85525f6e7eeabcfdd372862b21ee1915db1b498a04e8bf0e389b607ff0bd"},
- {file = "yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215"},
- {file = "yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d"},
- {file = "yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9"},
- {file = "yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8"},
+ {file = "yarl-1.24.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88f50c94e21a0a7f14042c015b0eba1881af78562e7bf007e0033e624da59750"},
+ {file = "yarl-1.24.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6efbccc3d7f75d5b03105172a8dc86d82ba4da86817952529dd93185f4a88be2"},
+ {file = "yarl-1.24.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0ebfaffe1a16cb72141c8e09f18cc76856dbe58639f393a4f2b26e474b96b871"},
+ {file = "yarl-1.24.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ac73abdc7ab75610f95a8fd994c6457e87752b02a63987e188f937a1fc180f0"},
+ {file = "yarl-1.24.5-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4d97a951a81039050e45f04e96689b58b8243fa5e62aa14fe67cb6075300885e"},
+ {file = "yarl-1.24.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fe7b7bb170daccbba19ad33012d2b15f1e7942296fd4d45fc1b79013da8cc0f2"},
+ {file = "yarl-1.24.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:89a1bbb58e0e3f7a283653d854b1e95d65e5cfd4af224dac5f02629ec1a3e621"},
+ {file = "yarl-1.24.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7fa5e51397466ea7e98de493fa2ff1b8193cfef8a7b0f9b4842f92d342df0dba"},
+ {file = "yarl-1.24.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4103b77b8a8225e413107d2349b65eb3c1c52627b5cc5c3c4c1c6a798b218950"},
+ {file = "yarl-1.24.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9f3e9c8a9ecffa57bef8fb4fa19e5fa4d2d8307cf6bac5b1fca5e5860f4ba00"},
+ {file = "yarl-1.24.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0ebc836c47a6477e182169c6a476fc691d12b518894bf7dd2572f0d59f1c7ed"},
+ {file = "yarl-1.24.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:96d30286dd02679e32a39aa8f0b7498fc847fcda46cfc09df5513e82ce252440"},
+ {file = "yarl-1.24.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:fd8c81f346b58f45818d09ea11db69a8d5fd34a224b79871f6d44f12cd7977b1"},
+ {file = "yarl-1.24.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5c55256dee8f4b27bfbf636c8363383c7c8db7890c7cba5217d7bd5f5f21dab6"},
+ {file = "yarl-1.24.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9f4d8cf085a4c6a40fb97ea0f46938a8df43c85d31f9d45e2a8867ea9293790d"},
+ {file = "yarl-1.24.5-cp310-cp310-win_amd64.whl", hash = "sha256:240cbec09667c1fed4c6cd0060b9ec57332427d7441289a2ed8875dc9fb2b224"},
+ {file = "yarl-1.24.5-cp310-cp310-win_arm64.whl", hash = "sha256:8a6987eaad834cb32dd57d9d582225f0054a5d1af706ccfbbdba735af4927e13"},
+ {file = "yarl-1.24.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2c1fe720934a16ea8e7146175cba2126f87f54912c8c5435e7f7c7a51ef808d3"},
+ {file = "yarl-1.24.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c687ed078e145f5fd53a14854beff320e1d2ab76df03e2009c98f39a0f68f39a"},
+ {file = "yarl-1.24.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:709f1efed56c4a145793c046cd4939f9959bcd818979a787b77d8e09c57a0840"},
+ {file = "yarl-1.24.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874019bd513008b009f58657134e5d0c5e030b3559bd0553976837adf52fe966"},
+ {file = "yarl-1.24.5-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a4582acf7ef76482f6f511ebaf1946dae7f2e85ec4728b81a678c01df63bd723"},
+ {file = "yarl-1.24.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2cabe6546e41dabe439999a23fcb5246e0c3b595b4315b96ef755252be90caeb"},
+ {file = "yarl-1.24.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:17f57620f5475b3c69109376cc87e42a7af5db13c9398e4292772a706ff10780"},
+ {file = "yarl-1.24.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:570fec8fbd22b032733625f03f10b7ff023bc399213db15e72a7acaef28c2f4e"},
+ {file = "yarl-1.24.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5fede79c6f73ff2c3ef822864cb1ada23196e62756df53bc6231d351a49516a2"},
+ {file = "yarl-1.24.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ccf9aca873b767977c73df497a85dbedee4ee086ae9ae49dc461333b9b79f58"},
+ {file = "yarl-1.24.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ad5d8201d310b031e6cd839d9bac2d4e5a01533ce5d3d5b50b7de1ef3af1de61"},
+ {file = "yarl-1.24.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:841f0852f48fefea3b12c9dfec00704dfa3aef5215d0e3ce564bb3d7cd8d57c6"},
+ {file = "yarl-1.24.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:9baafc71b04f8f4bb0703b21d6fc9f0c30b346c636a532ff16ec8491a5ea4b1f"},
+ {file = "yarl-1.24.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d897129df1a22b12aeed2c2c98df0785a2e8e6e0bde87b389491d0025c187077"},
+ {file = "yarl-1.24.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dd625535328fd9882374356269227670189adfcc6a2d90284f323c05862eecbd"},
+ {file = "yarl-1.24.5-cp311-cp311-win_amd64.whl", hash = "sha256:f4239bbec5a3577ddb49e4b50aeb32d8e5792098262ae2f63723f916a29b1a25"},
+ {file = "yarl-1.24.5-cp311-cp311-win_arm64.whl", hash = "sha256:3ac6aff147deb9c09461b2d4bbdf6256831198f5d8a23f5d37138213090b6d8a"},
+ {file = "yarl-1.24.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d693396e5aea78db03decd60aec9ece16c9b40ba00a587f089615ff4e718a81d"},
+ {file = "yarl-1.24.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3363fcc96e665878946ad7a106b9a13eac0541766a690ef287c0232ac768b6ec"},
+ {file = "yarl-1.24.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9d399bdcfb4a0f659b9b3788bbc89babe63d9a6a65aacdf4d4e7065ff2e6316c"},
+ {file = "yarl-1.24.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90333fd89b43c0d08ac85f3f1447593fc2c66de18c3d6378d7125ea118dc7a54"},
+ {file = "yarl-1.24.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:665b0a2c463cc9423dd647e0bfd9f4ccc9b50f768c55304d5e9f80b177c1de12"},
+ {file = "yarl-1.24.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e006d3a974c4ee19512e5f058abedb6eef36a5e553c14812bdeba1758d812e6d"},
+ {file = "yarl-1.24.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e7d42c531243450ef0d4d9c172e7ed6ef052640f195629065041b5add4e058d1"},
+ {file = "yarl-1.24.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f08c7513ecef5aad65687bfdf6bc601ae9fccd04a42904501f8f7141abad9eb9"},
+ {file = "yarl-1.24.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c95b17fe34ed802f17e205112e6e10db92275c34fee290aa9bdc55a9c724027"},
+ {file = "yarl-1.24.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56b149b22de33b23b0c6077ab9518c6dcb538ad462e1830e68d06591ccf6e38b"},
+ {file = "yarl-1.24.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a8fe66b8f300da93798025a785a5b90b42f3810dc2b72283ff84a41aaaebc293"},
+ {file = "yarl-1.24.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:377fe3732edbaf78ee74efdf2c9f49f6e99f20e7f9d2649fda3eb4badd77d76e"},
+ {file = "yarl-1.24.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e8ffa78582120024f476a611d7befc123cee59e47e8309d470cf667d806e613b"},
+ {file = "yarl-1.24.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:daba5e594f06114e37db186efd2dd916609071e59daca901a0a2e71f02b142ce"},
+ {file = "yarl-1.24.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:65be18ec59496c13908f02a2472751d9ef840b4f3fb5726f129306bf6a2a7bba"},
+ {file = "yarl-1.24.5-cp312-cp312-win_amd64.whl", hash = "sha256:a929d878fec099030c292803b31e5d5540a7b6a31e6a3cc76cb4685fc2a2f51b"},
+ {file = "yarl-1.24.5-cp312-cp312-win_arm64.whl", hash = "sha256:7ce27823052e2013b597e0c738b13e7e36b8ccb9400df8959417b052ab0fd92c"},
+ {file = "yarl-1.24.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:79af890482fc94648e8cde4c68620378f7fef60932710fa17a66abc039244da2"},
+ {file = "yarl-1.24.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46c2f213e23a04b93a392942d782eb9e413e6ef6bf7c8c53884e599a5c174dcb"},
+ {file = "yarl-1.24.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92ab3e11448f2ff7bf53c5a26eff0edc086898ec8b21fb154b85839ce1d88075"},
+ {file = "yarl-1.24.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ebb0ec7f17803063d5aeb982f3b1bd2b2f4e4fae6751226cbd6ba1fcfe9e63ff"},
+ {file = "yarl-1.24.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:82632daed195dcc8ea664e8556dc9bdbd671960fb3776bd92806ce05792c2448"},
+ {file = "yarl-1.24.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:53e549287ef628fecba270045c9701b0c564563a9b0577d24a4ec75b8ab8040f"},
+ {file = "yarl-1.24.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fcd3b77e2f17bbe4ca56ec7bcb07992647d19d0b9c05d84886dcd6f9eb810afd"},
+ {file = "yarl-1.24.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d46b86567dd4e248c6c159fcbcdcce01e0a5c8a7cd2334a0fff759d0fa075b16"},
+ {file = "yarl-1.24.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f72c74aa99359e27a2ee8d6613fefa28b5f76a983c083074dfc2aaa4ab46213"},
+ {file = "yarl-1.24.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f45789ce415a7ec0820dc4f82925f9b5f7732070be1dec1f5f23ec381435a24"},
+ {file = "yarl-1.24.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6e73e7fe93f17a7b191f52ec9da9dd8c06a8fe735a1ecbd13b97d1c723bff385"},
+ {file = "yarl-1.24.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4a36f9becdd4c5c52a20c3e9484128b070b1dcfc8944c006f3a528295a359a9c"},
+ {file = "yarl-1.24.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:7bcbe0fcf850eae67b6b01749815a4f7161c560a844c769ad7b48fcd99f791c4"},
+ {file = "yarl-1.24.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:24e861e9630e0daddcb9191fb187f60f034e17a4426f8101279f0c475cd74144"},
+ {file = "yarl-1.24.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9335a099ad87287c37fe5d1a982ff392fa5efe5d14b40a730b1ec1d6a41382b4"},
+ {file = "yarl-1.24.5-cp313-cp313-win_amd64.whl", hash = "sha256:2dbe06fc16bc91502bca713704022182e5729861ae00277c3a23354b40929740"},
+ {file = "yarl-1.24.5-cp313-cp313-win_arm64.whl", hash = "sha256:6b8536851f9f65e7f00c7a1d49ba7f2be0ffe2c11555367fc9f50d9f842410a1"},
+ {file = "yarl-1.24.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:2729fcfc4f6a596fb0c50f32090400aa9367774ac296a00387e65098c0befa76"},
+ {file = "yarl-1.24.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ff330d3c30db4eb6b01d79e29d2d0b407a7ecad39cfd9ec993ece57396a2ec0d"},
+ {file = "yarl-1.24.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e42d75862735da90e7fc5a7b23db0c976f737113a54b3c9777a9b665e9cbff75"},
+ {file = "yarl-1.24.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3732e66413163e72508da9eff9ce9d2846fde51fae45d3605393d3e6cd303e9"},
+ {file = "yarl-1.24.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5b8ee53be440a0cffc991a27be3057e0530122548dbe7c0892df08822fce5ede"},
+ {file = "yarl-1.24.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:af3aefa655adb5869491fa907e652290386800ae99cc50095cba71e2c6aefdca"},
+ {file = "yarl-1.24.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2120b96872df4a117cde97d270bac96aea7cc52205d305cf4611df694a487027"},
+ {file = "yarl-1.24.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66410eb6345d467151934b49bfa70fb32f5b35a6140baa40ad97d6436abea2e9"},
+ {file = "yarl-1.24.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4af7b7e1be0a69bee8210735fe6dcfc38879adfac6d62e789d53ba432d1ffa41"},
+ {file = "yarl-1.24.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa139875ff98ab97da323cfadfaff08900d1ad42f1b5087b0b812a55c5a06373"},
+ {file = "yarl-1.24.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:0055afc45e864b92729ac7600e2d102c17bef060647e74bca75fa84d66b9ff36"},
+ {file = "yarl-1.24.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f0e466ed7511fe9d459a819edbc6c2585c0b6eabde9fa8a8947552468a7a6ef0"},
+ {file = "yarl-1.24.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f141474e85b7e54998ec5180530a7cda99ab29e282fa50e0756d89981a9b43c5"},
+ {file = "yarl-1.24.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:e2935f8c39e3b03e83519292d78f075189978f3f4adc15a78144c7c8e2a1cba5"},
+ {file = "yarl-1.24.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9d1216a7f6f77836617dba35687c5b78a4170afc3c3f18fc788f785ba26565c4"},
+ {file = "yarl-1.24.5-cp314-cp314-win_amd64.whl", hash = "sha256:5ba4f78df2bcc19f764a4b26a8a4f5049c110090ad5825993aacb052bf8003ad"},
+ {file = "yarl-1.24.5-cp314-cp314-win_arm64.whl", hash = "sha256:9e4e16c73d717c5cf27626c524d0a2e261ad20e46932b2670f64ad5dde23e26f"},
+ {file = "yarl-1.24.5-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e1ae548a9d901adca07899a4147a7c826bbcc06239d3ce9a59f57886a28a4c88"},
+ {file = "yarl-1.24.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ff405d91509d88e8d44129cd87b18d70acd1f0c1aeabd7bc3c46792b1fe2acba"},
+ {file = "yarl-1.24.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:47e98aab9d8d82ff682e7b0b5dded33bf138a32b817fcf7fa3b27b2d7c412928"},
+ {file = "yarl-1.24.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f0a658a6d3fafee5c6f63c58f3e785c8c43c93fbc02bf9f2b6663f8185e0971f"},
+ {file = "yarl-1.24.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4377407001ca3c057773f44d8ddd6358fa5f691407c1ba92210bd3cf8d9e4c95"},
+ {file = "yarl-1.24.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7c0494a31a1ac5461a226e7947a9c9b78c44e1dc7185164fa7e9651557a5d9bc"},
+ {file = "yarl-1.24.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a7cff474ab7cd149765bb784cf6d78b32e18e20473fb7bda860bce98ab58e9da"},
+ {file = "yarl-1.24.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cbb833ccacdb5519eff9b8b71ee618cc2801c878e77e288775d77c3a2ced858a"},
+ {file = "yarl-1.24.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:82f75e05912e84b7a0fe57075d9c59de3cb352b928330f2eb69b2e1f54c3e1f0"},
+ {file = "yarl-1.24.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:16a2f5010280020e90f5330257e6944bc33e73593b136cc5a241e6c1dc292498"},
+ {file = "yarl-1.24.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ffcd54362564dc1a30fb74d8b8a6e5a6b11ebd5e27266adc3b7427a21a6c9104"},
+ {file = "yarl-1.24.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0465ec8cedc2349b97a6b595ace64084a50c6e839eca40aa0626f38b8350e331"},
+ {file = "yarl-1.24.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4db9aecb141cb7a5447171b57aa1ed3a8fee06af40b992ffc31206c0b0121550"},
+ {file = "yarl-1.24.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f540c013589084679a6c7fac07096b10159737918174f5dfc5e11bf5bca4dfe6"},
+ {file = "yarl-1.24.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a61834fb15d81322d872eaafd333838ae7c9cea84067f232656f75965933d047"},
+ {file = "yarl-1.24.5-cp314-cp314t-win_amd64.whl", hash = "sha256:5c88e5815a49d289e599f3513aa7fde0bc2092ff188f99c940f007f90f53d104"},
+ {file = "yarl-1.24.5-cp314-cp314t-win_arm64.whl", hash = "sha256:cf139c02f5f23ef6532040a30ff662c00a318c952334f211046b8e60b7f17688"},
+ {file = "yarl-1.24.5-py3-none-any.whl", hash = "sha256:a33700d13d9b7d84fd10947b09ff69fb9a792e519c8cb9764a3ca70baa6c23a7"},
+ {file = "yarl-1.24.5.tar.gz", hash = "sha256:e81b83143bee16329c23db3c1b2d82b29892fcbcb849186d2f6e98a5abe9a57f"},
]
-markers = {main = "extra == \"aiohttp\""}
[package.dependencies]
idna = ">=2.0"
@@ -1596,11 +1461,9 @@ multidict = ">=4.0"
propcache = ">=0.2.1"
[extras]
-aiohttp = ["httpx-aiohttp"]
-datastream = ["wasmtime", "websockets"]
-rulesengine = ["wasmtime"]
+aiohttp = ["aiohttp", "httpx-aiohttp"]
[metadata]
lock-version = "2.1"
python-versions = "^3.10"
-content-hash = "d12f2b0714d21d258fab37327fffd7eed95cbda40524b341fc8e0479072c5342"
+content-hash = "ae72458cc9170491280c32063e114504d6d14e4e72794aefcc730f6d72478732"
diff --git a/reference.md b/reference.md
index b52a43b..38730d7 100644
--- a/reference.md
+++ b/reference.md
@@ -7168,6 +7168,1009 @@ client.credits.count_credit_event_ledger(
+
+
+
+
+## catalogs
+client.catalogs.list_catalogs(...) -> ListCatalogsResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.list_catalogs(
+ is_default=True,
+ q="q",
+ limit=1000000,
+ offset=1000000,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**is_default:** `typing.Optional[bool]`
+
+
+
+
+
+-
+
+**q:** `typing.Optional[str]` — Search by catalog name
+
+
+
+
+
+-
+
+**limit:** `typing.Optional[int]` — Page limit (default 100)
+
+
+
+
+
+-
+
+**offset:** `typing.Optional[int]` — Page offset (default 0)
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.create_catalog(...) -> CreateCatalogResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.create_catalog(
+ is_default=True,
+ name="name",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**is_default:** `bool`
+
+
+
+
+
+-
+
+**name:** `str`
+
+
+
+
+
+-
+
+**description:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.get_catalog(...) -> GetCatalogResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.get_catalog(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.update_catalog(...) -> UpdateCatalogResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.update_catalog(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**description:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**is_default:** `typing.Optional[bool]`
+
+
+
+
+
+-
+
+**name:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.delete_catalog(...) -> DeleteCatalogResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.delete_catalog(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.get_configuration(...) -> GetConfigurationResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.get_configuration(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.update_configuration(...) -> UpdateConfigurationResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.update_configuration(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**custom_plan_cta_text:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**custom_plan_cta_url:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**custom_plan_price_text:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**custom_plans_visible:** `typing.Optional[bool]`
+
+
+
+
+
+-
+
+**ordered_add_ons:** `typing.Optional[typing.List[CatalogConfigOrderedPlan]]`
+
+
+
+
+
+-
+
+**ordered_bundles:** `typing.Optional[typing.List[CatalogConfigOrderedBundle]]`
+
+
+
+
+
+-
+
+**ordered_plans:** `typing.Optional[typing.List[CatalogConfigOrderedPlan]]`
+
+
+
+
+
+-
+
+**pricing_model:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**pricing_url:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.get_credit_bundles_in_catalog(...) -> GetCreditBundlesInCatalogResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.get_credit_bundles_in_catalog(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.add_credit_bundle(...)
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.add_credit_bundle(
+ catalog_id="catalog_id",
+ credit_bundle_id="credit_bundle_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**credit_bundle_id:** `str` — credit_bundle_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.remove_credit_bundle(...)
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.remove_credit_bundle(
+ catalog_id="catalog_id",
+ credit_bundle_id="credit_bundle_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**credit_bundle_id:** `str` — credit_bundle_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.get_derived_features(...) -> GetDerivedFeaturesResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.get_derived_features(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.get_plans_in_catalog(...) -> GetPlansInCatalogResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.get_plans_in_catalog(
+ catalog_id="catalog_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.add_plan(...)
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.add_plan(
+ catalog_id="catalog_id",
+ plan_id="plan_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**plan_id:** `str` — plan_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.catalogs.remove_plan(...)
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.catalogs.remove_plan(
+ catalog_id="catalog_id",
+ plan_id="plan_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**catalog_id:** `str` — catalog_id
+
+
+
+
+
+-
+
+**plan_id:** `str` — plan_id
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
@@ -15984,6 +16987,73 @@ client.components.delete_component(
+
+
+
+
+client.components.bind_catalog(...) -> BindCatalogResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.components.bind_catalog(
+ component_id="component_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**component_id:** `str` — component_id
+
+
+
+
+
+-
+
+**catalog_id:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
@@ -16193,6 +17263,14 @@ client.planbundle.create_custom_plan_bundle(
-
+**credit_grants:** `typing.Optional[typing.List[PlanBundleCreditGrantRequestBody]]`
+
+
+
+
+
+-
+
**plan:** `typing.Optional[CreateCustomPlanBundlePlanRequestBody]`
@@ -16405,6 +17483,92 @@ client.planbundle.update_plan_bundle(
## dataexports
+client.dataexports.list_data_exports(...) -> ListDataExportsResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.dataexports.list_data_exports(
+ export_type="audit-log",
+ status="failure",
+ limit=1000000,
+ offset=1000000,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**export_type:** `typing.Optional[DataExportType]`
+
+
+
+
+
+-
+
+**status:** `typing.Optional[DataExportStatus]`
+
+
+
+
+
+-
+
+**limit:** `typing.Optional[int]` — Page limit (default 100)
+
+
+
+
+
+-
+
+**offset:** `typing.Optional[int]` — Page offset (default 0)
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
client.dataexports.create_data_export(...) -> CreateDataExportResponse
-
@@ -16427,7 +17591,8 @@ client = Schematic(
)
client.dataexports.create_data_export(
- metadata="metadata",
+ export_type="audit-log",
+ output_file_type="csv",
)
```
@@ -16452,7 +17617,7 @@ client.dataexports.create_data_export(
-
-**metadata:** `str`
+**output_file_type:** `DataExportOutputFileType`
@@ -16460,7 +17625,66 @@ client.dataexports.create_data_export(
-
-**output_file_type:** `DataExportOutputFileType`
+**metadata:** `typing.Optional[DataExportMetadata]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.dataexports.get_data_export(...) -> GetDataExportResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from schematic import Schematic
+from schematic.environment import SchematicEnvironment
+
+client = Schematic(
+ api_key="",
+ environment=SchematicEnvironment.DEFAULT,
+)
+
+client.dataexports.get_data_export(
+ data_export_id="data_export_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**data_export_id:** `str` — data_export_id
diff --git a/src/schematic/__init__.py b/src/schematic/__init__.py
index 1551ca5..c7255a6 100644
--- a/src/schematic/__init__.py
+++ b/src/schematic/__init__.py
@@ -18,6 +18,7 @@
ApiKeyIntegrationResponseData,
ApiKeyResponseData,
ApiKeyScope,
+ AuditLogExportMetadata,
AuditLogListResponseData,
AuditLogResponseData,
BillingCouponResponseData,
@@ -68,6 +69,18 @@
BillingTiersMode,
CaptureRawEvent,
CaptureRawEventBatch,
+ CatalogConfigOrderedBundle,
+ CatalogConfigOrderedBundleResponseData,
+ CatalogConfigOrderedEntitlement,
+ CatalogConfigOrderedEntitlementResponseData,
+ CatalogConfigOrderedPlan,
+ CatalogConfigOrderedPlanResponseData,
+ CatalogConfigurationResponseData,
+ CatalogCreditBundleIDsResponseData,
+ CatalogDerivedFeatureResponseData,
+ CatalogDerivedFeaturesResponseData,
+ CatalogPlanIDsResponseData,
+ CatalogResponseData,
ChangeSubscriptionInternalRequestBody,
ChangeSubscriptionRequestBody,
ChargeType,
@@ -89,6 +102,7 @@
CompanyCreditBalanceResponseData,
CompanyDetailResponseData,
CompanyEventPeriodMetricsResponseData,
+ CompanyFeatureUsageExportMetadata,
CompanyLedgerResponseData,
CompanyMatchingCriteria,
CompanyMembershipDetailResponseData,
@@ -167,6 +181,9 @@
CustomPlanConfig,
CustomPlanViewConfigResponseData,
DataEventPayload,
+ DataExportMetadata,
+ DataExportMetadata_AuditLog,
+ DataExportMetadata_CompanyFeatureUsage,
DataExportOutputFileType,
DataExportResponseData,
DataExportStatus,
@@ -268,6 +285,7 @@
PlanBundleCreditGrantRequestBody,
PlanBundleEntitlementRequestBody,
PlanBundleResponseData,
+ PlanCatalogMembershipResponseData,
PlanChangeAction,
PlanChangeBasePlanAction,
PlanChangeResponseData,
@@ -305,6 +323,7 @@
PreviewObject,
PreviewObjectResponseData,
PreviewSubscriptionChangeResponseData,
+ PreviewSubscriptionDiscountResponseData,
PreviewSubscriptionFinanceResponseData,
PreviewSubscriptionUpcomingInvoiceLineItems,
ProrationBehavior,
@@ -343,6 +362,7 @@
RulesengineTraitDefinition,
RulesengineTraitDefinitionComparableType,
RulesengineUser,
+ RulesengineWarningTier,
ScheduledCheckoutResponseData,
ScheduledCheckoutStatus,
ScheduledDowngradeConfigBehavior,
@@ -385,6 +405,7 @@
UsageTimeSeriesPointResponseData,
UserDetailResponseData,
UserResponseData,
+ WarningTier,
WarningTierRequestBody,
WarningTierResponseData,
WebFeatureUsageWebhookOutput,
@@ -404,6 +425,7 @@
accesstokens,
accounts,
billing,
+ catalogs,
checkout,
companies,
components,
@@ -488,6 +510,19 @@
UpsertInvoiceResponse,
UpsertPaymentMethodResponse,
)
+ from .catalogs import (
+ CreateCatalogResponse,
+ DeleteCatalogResponse,
+ GetCatalogResponse,
+ GetConfigurationResponse,
+ GetCreditBundlesInCatalogResponse,
+ GetDerivedFeaturesResponse,
+ GetPlansInCatalogResponse,
+ ListCatalogsParams,
+ ListCatalogsResponse,
+ UpdateCatalogResponse,
+ UpdateConfigurationResponse,
+ )
from .checkout import (
CancelSubscriptionResponse,
CheckoutInternalResponse,
@@ -558,6 +593,7 @@
UpsertUserTraitResponse,
)
from .components import (
+ BindCatalogResponse,
CountComponentsParams,
CountComponentsResponse,
CreateComponentResponse,
@@ -616,7 +652,12 @@
UpdateCreditBundleDetailsResponse,
ZeroOutGrantResponse,
)
- from .dataexports import CreateDataExportResponse
+ from .dataexports import (
+ CreateDataExportResponse,
+ GetDataExportResponse,
+ ListDataExportsParams,
+ ListDataExportsResponse,
+ )
from .entitlements import (
CountCompanyOverridesParams,
CountCompanyOverridesResponse,
@@ -796,6 +837,7 @@
"AssumeStripeInstalledResponse": ".integrationsapi",
"AsyncSchematic": ".client",
"AsyncSchematicConfig": ".client",
+ "AuditLogExportMetadata": ".types",
"AuditLogListResponseData": ".types",
"AuditLogResponseData": ".types",
"BadRequestError": ".errors",
@@ -845,9 +887,22 @@
"BillingSubscriptionTrialEndSetting": ".types",
"BillingSubscriptionView": ".types",
"BillingTiersMode": ".types",
+ "BindCatalogResponse": ".components",
"CancelSubscriptionResponse": ".checkout",
"CaptureRawEvent": ".types",
"CaptureRawEventBatch": ".types",
+ "CatalogConfigOrderedBundle": ".types",
+ "CatalogConfigOrderedBundleResponseData": ".types",
+ "CatalogConfigOrderedEntitlement": ".types",
+ "CatalogConfigOrderedEntitlementResponseData": ".types",
+ "CatalogConfigOrderedPlan": ".types",
+ "CatalogConfigOrderedPlanResponseData": ".types",
+ "CatalogConfigurationResponseData": ".types",
+ "CatalogCreditBundleIDsResponseData": ".types",
+ "CatalogDerivedFeatureResponseData": ".types",
+ "CatalogDerivedFeaturesResponseData": ".types",
+ "CatalogPlanIDsResponseData": ".types",
+ "CatalogResponseData": ".types",
"ChangeSubscriptionInternalRequestBody": ".types",
"ChangeSubscriptionRequestBody": ".types",
"ChargeType": ".types",
@@ -873,6 +928,7 @@
"CompanyCreditBalanceResponseData": ".types",
"CompanyDetailResponseData": ".types",
"CompanyEventPeriodMetricsResponseData": ".types",
+ "CompanyFeatureUsageExportMetadata": ".types",
"CompanyLedgerResponseData": ".types",
"CompanyMatchingCriteria": ".types",
"CompanyMembershipDetailResponseData": ".types",
@@ -971,6 +1027,7 @@
"CreateBillingPlanCreditGrantRequestBody": ".types",
"CreateBillingPlanCreditGrantResponse": ".credits",
"CreateBillingPriceTierRequestBody": ".types",
+ "CreateCatalogResponse": ".catalogs",
"CreateCompanyOverrideResponse": ".entitlements",
"CreateCompanyResponse": ".companies",
"CreateComponentResponse": ".components",
@@ -1034,6 +1091,9 @@
"CustomPlanConfig": ".types",
"CustomPlanViewConfigResponseData": ".types",
"DataEventPayload": ".types",
+ "DataExportMetadata": ".types",
+ "DataExportMetadata_AuditLog": ".types",
+ "DataExportMetadata_CompanyFeatureUsage": ".types",
"DataExportOutputFileType": ".types",
"DataExportResponseData": ".types",
"DataExportStatus": ".types",
@@ -1049,6 +1109,7 @@
"DeleteBillingPlanCreditGrantRequestBody": ".types",
"DeleteBillingPlanCreditGrantResponse": ".credits",
"DeleteBillingProductResponse": ".billing",
+ "DeleteCatalogResponse": ".catalogs",
"DeleteCompanyByKeysResponse": ".companies",
"DeleteCompanyMembershipResponse": ".companies",
"DeleteCompanyOverrideResponse": ".entitlements",
@@ -1133,13 +1194,18 @@
"GetAuditLogResponse": ".accounts",
"GetBillingEntityChildSubscriptionsParams": ".companies",
"GetBillingEntityChildSubscriptionsResponse": ".companies",
+ "GetCatalogResponse": ".catalogs",
"GetCheckoutDataResponse": ".checkout",
"GetCompanyBillingEntityParams": ".companies",
"GetCompanyBillingEntityResponse": ".companies",
"GetCompanyOverrideResponse": ".entitlements",
"GetCompanyResponse": ".companies",
"GetComponentResponse": ".components",
+ "GetConfigurationResponse": ".catalogs",
"GetCreditBundleResponse": ".credits",
+ "GetCreditBundlesInCatalogResponse": ".catalogs",
+ "GetDataExportResponse": ".dataexports",
+ "GetDerivedFeaturesResponse": ".catalogs",
"GetEntityTraitDefinitionResponse": ".companies",
"GetEntityTraitValuesParams": ".companies",
"GetEntityTraitValuesResponse": ".companies",
@@ -1170,6 +1236,7 @@
"GetPlanParams": ".plans",
"GetPlanResponse": ".plans",
"GetPlanTraitResponse": ".companies",
+ "GetPlansInCatalogResponse": ".catalogs",
"GetPublicPlansResponse": ".componentspublic",
"GetScheduledCheckoutResponse": ".scheduledcheckout",
"GetSegmentIntegrationStatusResponse": ".events",
@@ -1229,6 +1296,8 @@
"ListBillingProductPricesResponse": ".billing",
"ListBillingProductsParams": ".billing",
"ListBillingProductsResponse": ".billing",
+ "ListCatalogsParams": ".catalogs",
+ "ListCatalogsResponse": ".catalogs",
"ListCompaniesParams": ".companies",
"ListCompaniesResponse": ".companies",
"ListCompanyCreditBalancesParams": ".credits",
@@ -1253,6 +1322,8 @@
"ListCustomPlanBillingsResponse": ".plans",
"ListCustomersWithSubscriptionsParams": ".billing",
"ListCustomersWithSubscriptionsResponse": ".billing",
+ "ListDataExportsParams": ".dataexports",
+ "ListDataExportsResponse": ".dataexports",
"ListEntityKeyDefinitionsParams": ".companies",
"ListEntityKeyDefinitionsResponse": ".companies",
"ListEntityTraitDefinitionsParams": ".companies",
@@ -1328,6 +1399,7 @@
"PlanBundleCreditGrantRequestBody": ".types",
"PlanBundleEntitlementRequestBody": ".types",
"PlanBundleResponseData": ".types",
+ "PlanCatalogMembershipResponseData": ".types",
"PlanChangeAction": ".types",
"PlanChangeBasePlanAction": ".types",
"PlanChangeResponseData": ".types",
@@ -1369,6 +1441,7 @@
"PreviewObject": ".types",
"PreviewObjectResponseData": ".types",
"PreviewSubscriptionChangeResponseData": ".types",
+ "PreviewSubscriptionDiscountResponseData": ".types",
"PreviewSubscriptionFinanceResponseData": ".types",
"PreviewSubscriptionUpcomingInvoiceLineItems": ".types",
"ProrationBehavior": ".types",
@@ -1413,6 +1486,7 @@
"RulesengineTraitDefinition": ".types",
"RulesengineTraitDefinitionComparableType": ".types",
"RulesengineUser": ".types",
+ "RulesengineWarningTier": ".types",
"RunIntegrationResponse": ".integrationsapi",
"ScheduledCheckoutResponseData": ".types",
"ScheduledCheckoutStatus": ".types",
@@ -1451,9 +1525,11 @@
"UpdateBillingCreditResponse": ".credits",
"UpdateBillingPlanCreditGrantRequestBody": ".types",
"UpdateBillingPlanCreditGrantResponse": ".credits",
+ "UpdateCatalogResponse": ".catalogs",
"UpdateCompanyOverrideResponse": ".entitlements",
"UpdateCompanyPlansResponse": ".plans",
"UpdateComponentResponse": ".components",
+ "UpdateConfigurationResponse": ".catalogs",
"UpdateCreditBundleDetailsResponse": ".credits",
"UpdateCreditBundleRequestBody": ".types",
"UpdateCustomerSubscriptionTrialEndResponse": ".checkout",
@@ -1500,6 +1576,7 @@
"UsageTimeSeriesPointResponseData": ".types",
"UserDetailResponseData": ".types",
"UserResponseData": ".types",
+ "WarningTier": ".types",
"WarningTierRequestBody": ".types",
"WarningTierResponseData": ".types",
"WebFeatureUsageWebhookOutput": ".types",
@@ -1518,6 +1595,7 @@
"accesstokens": ".accesstokens",
"accounts": ".accounts",
"billing": ".billing",
+ "catalogs": ".catalogs",
"checkout": ".checkout",
"companies": ".companies",
"components": ".components",
@@ -1575,6 +1653,7 @@ def __dir__():
"AssumeStripeInstalledResponse",
"AsyncSchematic",
"AsyncSchematicConfig",
+ "AuditLogExportMetadata",
"AuditLogListResponseData",
"AuditLogResponseData",
"BadRequestError",
@@ -1624,9 +1703,22 @@ def __dir__():
"BillingSubscriptionTrialEndSetting",
"BillingSubscriptionView",
"BillingTiersMode",
+ "BindCatalogResponse",
"CancelSubscriptionResponse",
"CaptureRawEvent",
"CaptureRawEventBatch",
+ "CatalogConfigOrderedBundle",
+ "CatalogConfigOrderedBundleResponseData",
+ "CatalogConfigOrderedEntitlement",
+ "CatalogConfigOrderedEntitlementResponseData",
+ "CatalogConfigOrderedPlan",
+ "CatalogConfigOrderedPlanResponseData",
+ "CatalogConfigurationResponseData",
+ "CatalogCreditBundleIDsResponseData",
+ "CatalogDerivedFeatureResponseData",
+ "CatalogDerivedFeaturesResponseData",
+ "CatalogPlanIDsResponseData",
+ "CatalogResponseData",
"ChangeSubscriptionInternalRequestBody",
"ChangeSubscriptionRequestBody",
"ChargeType",
@@ -1652,6 +1744,7 @@ def __dir__():
"CompanyCreditBalanceResponseData",
"CompanyDetailResponseData",
"CompanyEventPeriodMetricsResponseData",
+ "CompanyFeatureUsageExportMetadata",
"CompanyLedgerResponseData",
"CompanyMatchingCriteria",
"CompanyMembershipDetailResponseData",
@@ -1750,6 +1843,7 @@ def __dir__():
"CreateBillingPlanCreditGrantRequestBody",
"CreateBillingPlanCreditGrantResponse",
"CreateBillingPriceTierRequestBody",
+ "CreateCatalogResponse",
"CreateCompanyOverrideResponse",
"CreateCompanyResponse",
"CreateComponentResponse",
@@ -1813,6 +1907,9 @@ def __dir__():
"CustomPlanConfig",
"CustomPlanViewConfigResponseData",
"DataEventPayload",
+ "DataExportMetadata",
+ "DataExportMetadata_AuditLog",
+ "DataExportMetadata_CompanyFeatureUsage",
"DataExportOutputFileType",
"DataExportResponseData",
"DataExportStatus",
@@ -1828,6 +1925,7 @@ def __dir__():
"DeleteBillingPlanCreditGrantRequestBody",
"DeleteBillingPlanCreditGrantResponse",
"DeleteBillingProductResponse",
+ "DeleteCatalogResponse",
"DeleteCompanyByKeysResponse",
"DeleteCompanyMembershipResponse",
"DeleteCompanyOverrideResponse",
@@ -1912,13 +2010,18 @@ def __dir__():
"GetAuditLogResponse",
"GetBillingEntityChildSubscriptionsParams",
"GetBillingEntityChildSubscriptionsResponse",
+ "GetCatalogResponse",
"GetCheckoutDataResponse",
"GetCompanyBillingEntityParams",
"GetCompanyBillingEntityResponse",
"GetCompanyOverrideResponse",
"GetCompanyResponse",
"GetComponentResponse",
+ "GetConfigurationResponse",
"GetCreditBundleResponse",
+ "GetCreditBundlesInCatalogResponse",
+ "GetDataExportResponse",
+ "GetDerivedFeaturesResponse",
"GetEntityTraitDefinitionResponse",
"GetEntityTraitValuesParams",
"GetEntityTraitValuesResponse",
@@ -1949,6 +2052,7 @@ def __dir__():
"GetPlanParams",
"GetPlanResponse",
"GetPlanTraitResponse",
+ "GetPlansInCatalogResponse",
"GetPublicPlansResponse",
"GetScheduledCheckoutResponse",
"GetSegmentIntegrationStatusResponse",
@@ -2008,6 +2112,8 @@ def __dir__():
"ListBillingProductPricesResponse",
"ListBillingProductsParams",
"ListBillingProductsResponse",
+ "ListCatalogsParams",
+ "ListCatalogsResponse",
"ListCompaniesParams",
"ListCompaniesResponse",
"ListCompanyCreditBalancesParams",
@@ -2032,6 +2138,8 @@ def __dir__():
"ListCustomPlanBillingsResponse",
"ListCustomersWithSubscriptionsParams",
"ListCustomersWithSubscriptionsResponse",
+ "ListDataExportsParams",
+ "ListDataExportsResponse",
"ListEntityKeyDefinitionsParams",
"ListEntityKeyDefinitionsResponse",
"ListEntityTraitDefinitionsParams",
@@ -2107,6 +2215,7 @@ def __dir__():
"PlanBundleCreditGrantRequestBody",
"PlanBundleEntitlementRequestBody",
"PlanBundleResponseData",
+ "PlanCatalogMembershipResponseData",
"PlanChangeAction",
"PlanChangeBasePlanAction",
"PlanChangeResponseData",
@@ -2148,6 +2257,7 @@ def __dir__():
"PreviewObject",
"PreviewObjectResponseData",
"PreviewSubscriptionChangeResponseData",
+ "PreviewSubscriptionDiscountResponseData",
"PreviewSubscriptionFinanceResponseData",
"PreviewSubscriptionUpcomingInvoiceLineItems",
"ProrationBehavior",
@@ -2192,6 +2302,7 @@ def __dir__():
"RulesengineTraitDefinition",
"RulesengineTraitDefinitionComparableType",
"RulesengineUser",
+ "RulesengineWarningTier",
"RunIntegrationResponse",
"ScheduledCheckoutResponseData",
"ScheduledCheckoutStatus",
@@ -2230,9 +2341,11 @@ def __dir__():
"UpdateBillingCreditResponse",
"UpdateBillingPlanCreditGrantRequestBody",
"UpdateBillingPlanCreditGrantResponse",
+ "UpdateCatalogResponse",
"UpdateCompanyOverrideResponse",
"UpdateCompanyPlansResponse",
"UpdateComponentResponse",
+ "UpdateConfigurationResponse",
"UpdateCreditBundleDetailsResponse",
"UpdateCreditBundleRequestBody",
"UpdateCustomerSubscriptionTrialEndResponse",
@@ -2279,6 +2392,7 @@ def __dir__():
"UsageTimeSeriesPointResponseData",
"UserDetailResponseData",
"UserResponseData",
+ "WarningTier",
"WarningTierRequestBody",
"WarningTierResponseData",
"WebFeatureUsageWebhookOutput",
@@ -2297,6 +2411,7 @@ def __dir__():
"accesstokens",
"accounts",
"billing",
+ "catalogs",
"checkout",
"companies",
"components",
diff --git a/src/schematic/base_client.py b/src/schematic/base_client.py
index d07a74f..37bd267 100644
--- a/src/schematic/base_client.py
+++ b/src/schematic/base_client.py
@@ -15,6 +15,7 @@
from .accesstokens.client import AccesstokensClient, AsyncAccesstokensClient
from .accounts.client import AccountsClient, AsyncAccountsClient
from .billing.client import AsyncBillingClient, BillingClient
+ from .catalogs.client import AsyncCatalogsClient, CatalogsClient
from .checkout.client import AsyncCheckoutClient, CheckoutClient
from .companies.client import AsyncCompaniesClient, CompaniesClient
from .components.client import AsyncComponentsClient, ComponentsClient
@@ -114,6 +115,7 @@ def __init__(
self._accounts: typing.Optional[AccountsClient] = None
self._billing: typing.Optional[BillingClient] = None
self._credits: typing.Optional[CreditsClient] = None
+ self._catalogs: typing.Optional[CatalogsClient] = None
self._checkout: typing.Optional[CheckoutClient] = None
self._companies: typing.Optional[CompaniesClient] = None
self._entitlements: typing.Optional[EntitlementsClient] = None
@@ -190,6 +192,14 @@ def credits(self):
self._credits = CreditsClient(client_wrapper=self._client_wrapper)
return self._credits
+ @property
+ def catalogs(self):
+ if self._catalogs is None:
+ from .catalogs.client import CatalogsClient # noqa: E402
+
+ self._catalogs = CatalogsClient(client_wrapper=self._client_wrapper)
+ return self._catalogs
+
@property
def checkout(self):
if self._checkout is None:
@@ -423,6 +433,7 @@ def __init__(
self._accounts: typing.Optional[AsyncAccountsClient] = None
self._billing: typing.Optional[AsyncBillingClient] = None
self._credits: typing.Optional[AsyncCreditsClient] = None
+ self._catalogs: typing.Optional[AsyncCatalogsClient] = None
self._checkout: typing.Optional[AsyncCheckoutClient] = None
self._companies: typing.Optional[AsyncCompaniesClient] = None
self._entitlements: typing.Optional[AsyncEntitlementsClient] = None
@@ -507,6 +518,14 @@ def credits(self):
self._credits = AsyncCreditsClient(client_wrapper=self._client_wrapper)
return self._credits
+ @property
+ def catalogs(self):
+ if self._catalogs is None:
+ from .catalogs.client import AsyncCatalogsClient # noqa: E402
+
+ self._catalogs = AsyncCatalogsClient(client_wrapper=self._client_wrapper)
+ return self._catalogs
+
@property
def checkout(self):
if self._checkout is None:
diff --git a/src/schematic/catalogs/__init__.py b/src/schematic/catalogs/__init__.py
new file mode 100644
index 0000000..3700b69
--- /dev/null
+++ b/src/schematic/catalogs/__init__.py
@@ -0,0 +1,70 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
+import typing
+from importlib import import_module
+
+if typing.TYPE_CHECKING:
+ from .types import (
+ CreateCatalogResponse,
+ DeleteCatalogResponse,
+ GetCatalogResponse,
+ GetConfigurationResponse,
+ GetCreditBundlesInCatalogResponse,
+ GetDerivedFeaturesResponse,
+ GetPlansInCatalogResponse,
+ ListCatalogsParams,
+ ListCatalogsResponse,
+ UpdateCatalogResponse,
+ UpdateConfigurationResponse,
+ )
+_dynamic_imports: typing.Dict[str, str] = {
+ "CreateCatalogResponse": ".types",
+ "DeleteCatalogResponse": ".types",
+ "GetCatalogResponse": ".types",
+ "GetConfigurationResponse": ".types",
+ "GetCreditBundlesInCatalogResponse": ".types",
+ "GetDerivedFeaturesResponse": ".types",
+ "GetPlansInCatalogResponse": ".types",
+ "ListCatalogsParams": ".types",
+ "ListCatalogsResponse": ".types",
+ "UpdateCatalogResponse": ".types",
+ "UpdateConfigurationResponse": ".types",
+}
+
+
+def __getattr__(attr_name: str) -> typing.Any:
+ module_name = _dynamic_imports.get(attr_name)
+ if module_name is None:
+ raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}")
+ try:
+ module = import_module(module_name, __package__)
+ if module_name == f".{attr_name}":
+ return module
+ else:
+ return getattr(module, attr_name)
+ except ImportError as e:
+ raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e
+ except AttributeError as e:
+ raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e
+
+
+def __dir__():
+ lazy_attrs = list(_dynamic_imports.keys())
+ return sorted(lazy_attrs)
+
+
+__all__ = [
+ "CreateCatalogResponse",
+ "DeleteCatalogResponse",
+ "GetCatalogResponse",
+ "GetConfigurationResponse",
+ "GetCreditBundlesInCatalogResponse",
+ "GetDerivedFeaturesResponse",
+ "GetPlansInCatalogResponse",
+ "ListCatalogsParams",
+ "ListCatalogsResponse",
+ "UpdateCatalogResponse",
+ "UpdateConfigurationResponse",
+]
diff --git a/src/schematic/catalogs/client.py b/src/schematic/catalogs/client.py
new file mode 100644
index 0000000..8b9f1e4
--- /dev/null
+++ b/src/schematic/catalogs/client.py
@@ -0,0 +1,1234 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ..core.request_options import RequestOptions
+from ..types.catalog_config_ordered_bundle import CatalogConfigOrderedBundle
+from ..types.catalog_config_ordered_plan import CatalogConfigOrderedPlan
+from .raw_client import AsyncRawCatalogsClient, RawCatalogsClient
+from .types.create_catalog_response import CreateCatalogResponse
+from .types.delete_catalog_response import DeleteCatalogResponse
+from .types.get_catalog_response import GetCatalogResponse
+from .types.get_configuration_response import GetConfigurationResponse
+from .types.get_credit_bundles_in_catalog_response import GetCreditBundlesInCatalogResponse
+from .types.get_derived_features_response import GetDerivedFeaturesResponse
+from .types.get_plans_in_catalog_response import GetPlansInCatalogResponse
+from .types.list_catalogs_response import ListCatalogsResponse
+from .types.update_catalog_response import UpdateCatalogResponse
+from .types.update_configuration_response import UpdateConfigurationResponse
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class CatalogsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawCatalogsClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawCatalogsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawCatalogsClient
+ """
+ return self._raw_client
+
+ def list_catalogs(
+ self,
+ *,
+ is_default: typing.Optional[bool] = None,
+ q: typing.Optional[str] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ListCatalogsResponse:
+ """
+ Parameters
+ ----------
+ is_default : typing.Optional[bool]
+
+ q : typing.Optional[str]
+ Search by catalog name
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ListCatalogsResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.list_catalogs(
+ is_default=True,
+ q="q",
+ limit=1000000,
+ offset=1000000,
+ )
+ """
+ _response = self._raw_client.list_catalogs(
+ is_default=is_default, q=q, limit=limit, offset=offset, request_options=request_options
+ )
+ return _response.data
+
+ def create_catalog(
+ self,
+ *,
+ is_default: bool,
+ name: str,
+ description: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> CreateCatalogResponse:
+ """
+ Parameters
+ ----------
+ is_default : bool
+
+ name : str
+
+ description : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ CreateCatalogResponse
+ Created
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.create_catalog(
+ is_default=True,
+ name="name",
+ )
+ """
+ _response = self._raw_client.create_catalog(
+ is_default=is_default, name=name, description=description, request_options=request_options
+ )
+ return _response.data
+
+ def get_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetCatalogResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.get_catalog(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.get_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ def update_catalog(
+ self,
+ catalog_id: str,
+ *,
+ description: typing.Optional[str] = OMIT,
+ is_default: typing.Optional[bool] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> UpdateCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ description : typing.Optional[str]
+
+ is_default : typing.Optional[bool]
+
+ name : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ UpdateCatalogResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.update_catalog(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.update_catalog(
+ catalog_id, description=description, is_default=is_default, name=name, request_options=request_options
+ )
+ return _response.data
+
+ def delete_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> DeleteCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ DeleteCatalogResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.delete_catalog(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.delete_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ def get_configuration(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetConfigurationResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetConfigurationResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.get_configuration(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.get_configuration(catalog_id, request_options=request_options)
+ return _response.data
+
+ def update_configuration(
+ self,
+ catalog_id: str,
+ *,
+ custom_plan_cta_text: typing.Optional[str] = OMIT,
+ custom_plan_cta_url: typing.Optional[str] = OMIT,
+ custom_plan_price_text: typing.Optional[str] = OMIT,
+ custom_plans_visible: typing.Optional[bool] = OMIT,
+ ordered_add_ons: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ ordered_bundles: typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]] = OMIT,
+ ordered_plans: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ pricing_model: typing.Optional[str] = OMIT,
+ pricing_url: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> UpdateConfigurationResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ custom_plan_cta_text : typing.Optional[str]
+
+ custom_plan_cta_url : typing.Optional[str]
+
+ custom_plan_price_text : typing.Optional[str]
+
+ custom_plans_visible : typing.Optional[bool]
+
+ ordered_add_ons : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ ordered_bundles : typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]]
+
+ ordered_plans : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ pricing_model : typing.Optional[str]
+
+ pricing_url : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ UpdateConfigurationResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.update_configuration(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.update_configuration(
+ catalog_id,
+ custom_plan_cta_text=custom_plan_cta_text,
+ custom_plan_cta_url=custom_plan_cta_url,
+ custom_plan_price_text=custom_plan_price_text,
+ custom_plans_visible=custom_plans_visible,
+ ordered_add_ons=ordered_add_ons,
+ ordered_bundles=ordered_bundles,
+ ordered_plans=ordered_plans,
+ pricing_model=pricing_model,
+ pricing_url=pricing_url,
+ request_options=request_options,
+ )
+ return _response.data
+
+ def get_credit_bundles_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetCreditBundlesInCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetCreditBundlesInCatalogResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.get_credit_bundles_in_catalog(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.get_credit_bundles_in_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ def add_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.add_credit_bundle(
+ catalog_id="catalog_id",
+ credit_bundle_id="credit_bundle_id",
+ )
+ """
+ _response = self._raw_client.add_credit_bundle(catalog_id, credit_bundle_id, request_options=request_options)
+ return _response.data
+
+ def remove_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.remove_credit_bundle(
+ catalog_id="catalog_id",
+ credit_bundle_id="credit_bundle_id",
+ )
+ """
+ _response = self._raw_client.remove_credit_bundle(catalog_id, credit_bundle_id, request_options=request_options)
+ return _response.data
+
+ def get_derived_features(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetDerivedFeaturesResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetDerivedFeaturesResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.get_derived_features(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.get_derived_features(catalog_id, request_options=request_options)
+ return _response.data
+
+ def get_plans_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetPlansInCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetPlansInCatalogResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.get_plans_in_catalog(
+ catalog_id="catalog_id",
+ )
+ """
+ _response = self._raw_client.get_plans_in_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ def add_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.add_plan(
+ catalog_id="catalog_id",
+ plan_id="plan_id",
+ )
+ """
+ _response = self._raw_client.add_plan(catalog_id, plan_id, request_options=request_options)
+ return _response.data
+
+ def remove_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.catalogs.remove_plan(
+ catalog_id="catalog_id",
+ plan_id="plan_id",
+ )
+ """
+ _response = self._raw_client.remove_plan(catalog_id, plan_id, request_options=request_options)
+ return _response.data
+
+
+class AsyncCatalogsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawCatalogsClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawCatalogsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawCatalogsClient
+ """
+ return self._raw_client
+
+ async def list_catalogs(
+ self,
+ *,
+ is_default: typing.Optional[bool] = None,
+ q: typing.Optional[str] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ListCatalogsResponse:
+ """
+ Parameters
+ ----------
+ is_default : typing.Optional[bool]
+
+ q : typing.Optional[str]
+ Search by catalog name
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ListCatalogsResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.list_catalogs(
+ is_default=True,
+ q="q",
+ limit=1000000,
+ offset=1000000,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list_catalogs(
+ is_default=is_default, q=q, limit=limit, offset=offset, request_options=request_options
+ )
+ return _response.data
+
+ async def create_catalog(
+ self,
+ *,
+ is_default: bool,
+ name: str,
+ description: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> CreateCatalogResponse:
+ """
+ Parameters
+ ----------
+ is_default : bool
+
+ name : str
+
+ description : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ CreateCatalogResponse
+ Created
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.create_catalog(
+ is_default=True,
+ name="name",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create_catalog(
+ is_default=is_default, name=name, description=description, request_options=request_options
+ )
+ return _response.data
+
+ async def get_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetCatalogResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.get_catalog(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ async def update_catalog(
+ self,
+ catalog_id: str,
+ *,
+ description: typing.Optional[str] = OMIT,
+ is_default: typing.Optional[bool] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> UpdateCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ description : typing.Optional[str]
+
+ is_default : typing.Optional[bool]
+
+ name : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ UpdateCatalogResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.update_catalog(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update_catalog(
+ catalog_id, description=description, is_default=is_default, name=name, request_options=request_options
+ )
+ return _response.data
+
+ async def delete_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> DeleteCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ DeleteCatalogResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.delete_catalog(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ async def get_configuration(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetConfigurationResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetConfigurationResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.get_configuration(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get_configuration(catalog_id, request_options=request_options)
+ return _response.data
+
+ async def update_configuration(
+ self,
+ catalog_id: str,
+ *,
+ custom_plan_cta_text: typing.Optional[str] = OMIT,
+ custom_plan_cta_url: typing.Optional[str] = OMIT,
+ custom_plan_price_text: typing.Optional[str] = OMIT,
+ custom_plans_visible: typing.Optional[bool] = OMIT,
+ ordered_add_ons: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ ordered_bundles: typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]] = OMIT,
+ ordered_plans: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ pricing_model: typing.Optional[str] = OMIT,
+ pricing_url: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> UpdateConfigurationResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ custom_plan_cta_text : typing.Optional[str]
+
+ custom_plan_cta_url : typing.Optional[str]
+
+ custom_plan_price_text : typing.Optional[str]
+
+ custom_plans_visible : typing.Optional[bool]
+
+ ordered_add_ons : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ ordered_bundles : typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]]
+
+ ordered_plans : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ pricing_model : typing.Optional[str]
+
+ pricing_url : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ UpdateConfigurationResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.update_configuration(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update_configuration(
+ catalog_id,
+ custom_plan_cta_text=custom_plan_cta_text,
+ custom_plan_cta_url=custom_plan_cta_url,
+ custom_plan_price_text=custom_plan_price_text,
+ custom_plans_visible=custom_plans_visible,
+ ordered_add_ons=ordered_add_ons,
+ ordered_bundles=ordered_bundles,
+ ordered_plans=ordered_plans,
+ pricing_model=pricing_model,
+ pricing_url=pricing_url,
+ request_options=request_options,
+ )
+ return _response.data
+
+ async def get_credit_bundles_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetCreditBundlesInCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetCreditBundlesInCatalogResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.get_credit_bundles_in_catalog(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get_credit_bundles_in_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ async def add_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.add_credit_bundle(
+ catalog_id="catalog_id",
+ credit_bundle_id="credit_bundle_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.add_credit_bundle(
+ catalog_id, credit_bundle_id, request_options=request_options
+ )
+ return _response.data
+
+ async def remove_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.remove_credit_bundle(
+ catalog_id="catalog_id",
+ credit_bundle_id="credit_bundle_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.remove_credit_bundle(
+ catalog_id, credit_bundle_id, request_options=request_options
+ )
+ return _response.data
+
+ async def get_derived_features(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetDerivedFeaturesResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetDerivedFeaturesResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.get_derived_features(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get_derived_features(catalog_id, request_options=request_options)
+ return _response.data
+
+ async def get_plans_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetPlansInCatalogResponse:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetPlansInCatalogResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.get_plans_in_catalog(
+ catalog_id="catalog_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get_plans_in_catalog(catalog_id, request_options=request_options)
+ return _response.data
+
+ async def add_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.add_plan(
+ catalog_id="catalog_id",
+ plan_id="plan_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.add_plan(catalog_id, plan_id, request_options=request_options)
+ return _response.data
+
+ async def remove_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> None:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.catalogs.remove_plan(
+ catalog_id="catalog_id",
+ plan_id="plan_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.remove_plan(catalog_id, plan_id, request_options=request_options)
+ return _response.data
diff --git a/src/schematic/catalogs/raw_client.py b/src/schematic/catalogs/raw_client.py
new file mode 100644
index 0000000..538c1f2
--- /dev/null
+++ b/src/schematic/catalogs/raw_client.py
@@ -0,0 +1,2913 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ..core.api_error import ApiError as core_api_error_ApiError
+from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ..core.http_response import AsyncHttpResponse, HttpResponse
+from ..core.jsonable_encoder import encode_path_param
+from ..core.parse_error import ParsingError
+from ..core.pydantic_utilities import parse_obj_as
+from ..core.request_options import RequestOptions
+from ..core.serialization import convert_and_respect_annotation_metadata
+from ..errors.bad_request_error import BadRequestError
+from ..errors.forbidden_error import ForbiddenError
+from ..errors.internal_server_error import InternalServerError
+from ..errors.not_found_error import NotFoundError
+from ..errors.unauthorized_error import UnauthorizedError
+from ..types.api_error import ApiError as types_api_error_ApiError
+from ..types.catalog_config_ordered_bundle import CatalogConfigOrderedBundle
+from ..types.catalog_config_ordered_plan import CatalogConfigOrderedPlan
+from .types.create_catalog_response import CreateCatalogResponse
+from .types.delete_catalog_response import DeleteCatalogResponse
+from .types.get_catalog_response import GetCatalogResponse
+from .types.get_configuration_response import GetConfigurationResponse
+from .types.get_credit_bundles_in_catalog_response import GetCreditBundlesInCatalogResponse
+from .types.get_derived_features_response import GetDerivedFeaturesResponse
+from .types.get_plans_in_catalog_response import GetPlansInCatalogResponse
+from .types.list_catalogs_response import ListCatalogsResponse
+from .types.update_catalog_response import UpdateCatalogResponse
+from .types.update_configuration_response import UpdateConfigurationResponse
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawCatalogsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list_catalogs(
+ self,
+ *,
+ is_default: typing.Optional[bool] = None,
+ q: typing.Optional[str] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[ListCatalogsResponse]:
+ """
+ Parameters
+ ----------
+ is_default : typing.Optional[bool]
+
+ q : typing.Optional[str]
+ Search by catalog name
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ListCatalogsResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "catalogs",
+ method="GET",
+ params={
+ "is_default": is_default,
+ "q": q,
+ "limit": limit,
+ "offset": offset,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ListCatalogsResponse,
+ parse_obj_as(
+ type_=ListCatalogsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def create_catalog(
+ self,
+ *,
+ is_default: bool,
+ name: str,
+ description: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[CreateCatalogResponse]:
+ """
+ Parameters
+ ----------
+ is_default : bool
+
+ name : str
+
+ description : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[CreateCatalogResponse]
+ Created
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "catalogs",
+ method="POST",
+ json={
+ "description": description,
+ "is_default": is_default,
+ "name": name,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ CreateCatalogResponse,
+ parse_obj_as(
+ type_=CreateCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def get_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[GetCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[GetCatalogResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetCatalogResponse,
+ parse_obj_as(
+ type_=GetCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def update_catalog(
+ self,
+ catalog_id: str,
+ *,
+ description: typing.Optional[str] = OMIT,
+ is_default: typing.Optional[bool] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[UpdateCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ description : typing.Optional[str]
+
+ is_default : typing.Optional[bool]
+
+ name : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[UpdateCatalogResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}",
+ method="PUT",
+ json={
+ "description": description,
+ "is_default": is_default,
+ "name": name,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ UpdateCatalogResponse,
+ parse_obj_as(
+ type_=UpdateCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def delete_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[DeleteCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[DeleteCatalogResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ DeleteCatalogResponse,
+ parse_obj_as(
+ type_=DeleteCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def get_configuration(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[GetConfigurationResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[GetConfigurationResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/configuration",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetConfigurationResponse,
+ parse_obj_as(
+ type_=GetConfigurationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def update_configuration(
+ self,
+ catalog_id: str,
+ *,
+ custom_plan_cta_text: typing.Optional[str] = OMIT,
+ custom_plan_cta_url: typing.Optional[str] = OMIT,
+ custom_plan_price_text: typing.Optional[str] = OMIT,
+ custom_plans_visible: typing.Optional[bool] = OMIT,
+ ordered_add_ons: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ ordered_bundles: typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]] = OMIT,
+ ordered_plans: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ pricing_model: typing.Optional[str] = OMIT,
+ pricing_url: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[UpdateConfigurationResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ custom_plan_cta_text : typing.Optional[str]
+
+ custom_plan_cta_url : typing.Optional[str]
+
+ custom_plan_price_text : typing.Optional[str]
+
+ custom_plans_visible : typing.Optional[bool]
+
+ ordered_add_ons : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ ordered_bundles : typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]]
+
+ ordered_plans : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ pricing_model : typing.Optional[str]
+
+ pricing_url : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[UpdateConfigurationResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/configuration",
+ method="PUT",
+ json={
+ "custom_plan_cta_text": custom_plan_cta_text,
+ "custom_plan_cta_url": custom_plan_cta_url,
+ "custom_plan_price_text": custom_plan_price_text,
+ "custom_plans_visible": custom_plans_visible,
+ "ordered_add_ons": convert_and_respect_annotation_metadata(
+ object_=ordered_add_ons, annotation=typing.Sequence[CatalogConfigOrderedPlan], direction="write"
+ ),
+ "ordered_bundles": convert_and_respect_annotation_metadata(
+ object_=ordered_bundles, annotation=typing.Sequence[CatalogConfigOrderedBundle], direction="write"
+ ),
+ "ordered_plans": convert_and_respect_annotation_metadata(
+ object_=ordered_plans, annotation=typing.Sequence[CatalogConfigOrderedPlan], direction="write"
+ ),
+ "pricing_model": pricing_model,
+ "pricing_url": pricing_url,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ UpdateConfigurationResponse,
+ parse_obj_as(
+ type_=UpdateConfigurationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def get_credit_bundles_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[GetCreditBundlesInCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[GetCreditBundlesInCatalogResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/credit-bundles",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetCreditBundlesInCatalogResponse,
+ parse_obj_as(
+ type_=GetCreditBundlesInCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def add_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[None]
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/credit-bundles/{encode_path_param(credit_bundle_id)}",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return HttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def remove_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[None]
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/credit-bundles/{encode_path_param(credit_bundle_id)}",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return HttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def get_derived_features(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[GetDerivedFeaturesResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[GetDerivedFeaturesResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/features",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetDerivedFeaturesResponse,
+ parse_obj_as(
+ type_=GetDerivedFeaturesResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def get_plans_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[GetPlansInCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[GetPlansInCatalogResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/plans",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetPlansInCatalogResponse,
+ parse_obj_as(
+ type_=GetPlansInCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def add_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[None]
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/plans/{encode_path_param(plan_id)}",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return HttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ def remove_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[None]
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/plans/{encode_path_param(plan_id)}",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return HttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+
+class AsyncRawCatalogsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list_catalogs(
+ self,
+ *,
+ is_default: typing.Optional[bool] = None,
+ q: typing.Optional[str] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[ListCatalogsResponse]:
+ """
+ Parameters
+ ----------
+ is_default : typing.Optional[bool]
+
+ q : typing.Optional[str]
+ Search by catalog name
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ListCatalogsResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "catalogs",
+ method="GET",
+ params={
+ "is_default": is_default,
+ "q": q,
+ "limit": limit,
+ "offset": offset,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ListCatalogsResponse,
+ parse_obj_as(
+ type_=ListCatalogsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def create_catalog(
+ self,
+ *,
+ is_default: bool,
+ name: str,
+ description: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[CreateCatalogResponse]:
+ """
+ Parameters
+ ----------
+ is_default : bool
+
+ name : str
+
+ description : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[CreateCatalogResponse]
+ Created
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "catalogs",
+ method="POST",
+ json={
+ "description": description,
+ "is_default": is_default,
+ "name": name,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ CreateCatalogResponse,
+ parse_obj_as(
+ type_=CreateCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def get_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[GetCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[GetCatalogResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetCatalogResponse,
+ parse_obj_as(
+ type_=GetCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def update_catalog(
+ self,
+ catalog_id: str,
+ *,
+ description: typing.Optional[str] = OMIT,
+ is_default: typing.Optional[bool] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[UpdateCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ description : typing.Optional[str]
+
+ is_default : typing.Optional[bool]
+
+ name : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[UpdateCatalogResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}",
+ method="PUT",
+ json={
+ "description": description,
+ "is_default": is_default,
+ "name": name,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ UpdateCatalogResponse,
+ parse_obj_as(
+ type_=UpdateCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def delete_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[DeleteCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[DeleteCatalogResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ DeleteCatalogResponse,
+ parse_obj_as(
+ type_=DeleteCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def get_configuration(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[GetConfigurationResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[GetConfigurationResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/configuration",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetConfigurationResponse,
+ parse_obj_as(
+ type_=GetConfigurationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def update_configuration(
+ self,
+ catalog_id: str,
+ *,
+ custom_plan_cta_text: typing.Optional[str] = OMIT,
+ custom_plan_cta_url: typing.Optional[str] = OMIT,
+ custom_plan_price_text: typing.Optional[str] = OMIT,
+ custom_plans_visible: typing.Optional[bool] = OMIT,
+ ordered_add_ons: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ ordered_bundles: typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]] = OMIT,
+ ordered_plans: typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]] = OMIT,
+ pricing_model: typing.Optional[str] = OMIT,
+ pricing_url: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[UpdateConfigurationResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ custom_plan_cta_text : typing.Optional[str]
+
+ custom_plan_cta_url : typing.Optional[str]
+
+ custom_plan_price_text : typing.Optional[str]
+
+ custom_plans_visible : typing.Optional[bool]
+
+ ordered_add_ons : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ ordered_bundles : typing.Optional[typing.Sequence[CatalogConfigOrderedBundle]]
+
+ ordered_plans : typing.Optional[typing.Sequence[CatalogConfigOrderedPlan]]
+
+ pricing_model : typing.Optional[str]
+
+ pricing_url : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[UpdateConfigurationResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/configuration",
+ method="PUT",
+ json={
+ "custom_plan_cta_text": custom_plan_cta_text,
+ "custom_plan_cta_url": custom_plan_cta_url,
+ "custom_plan_price_text": custom_plan_price_text,
+ "custom_plans_visible": custom_plans_visible,
+ "ordered_add_ons": convert_and_respect_annotation_metadata(
+ object_=ordered_add_ons, annotation=typing.Sequence[CatalogConfigOrderedPlan], direction="write"
+ ),
+ "ordered_bundles": convert_and_respect_annotation_metadata(
+ object_=ordered_bundles, annotation=typing.Sequence[CatalogConfigOrderedBundle], direction="write"
+ ),
+ "ordered_plans": convert_and_respect_annotation_metadata(
+ object_=ordered_plans, annotation=typing.Sequence[CatalogConfigOrderedPlan], direction="write"
+ ),
+ "pricing_model": pricing_model,
+ "pricing_url": pricing_url,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ UpdateConfigurationResponse,
+ parse_obj_as(
+ type_=UpdateConfigurationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def get_credit_bundles_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[GetCreditBundlesInCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[GetCreditBundlesInCatalogResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/credit-bundles",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetCreditBundlesInCatalogResponse,
+ parse_obj_as(
+ type_=GetCreditBundlesInCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def add_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[None]
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/credit-bundles/{encode_path_param(credit_bundle_id)}",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return AsyncHttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def remove_credit_bundle(
+ self, catalog_id: str, credit_bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ credit_bundle_id : str
+ credit_bundle_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[None]
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/credit-bundles/{encode_path_param(credit_bundle_id)}",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return AsyncHttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def get_derived_features(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[GetDerivedFeaturesResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[GetDerivedFeaturesResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/features",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetDerivedFeaturesResponse,
+ parse_obj_as(
+ type_=GetDerivedFeaturesResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def get_plans_in_catalog(
+ self, catalog_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[GetPlansInCatalogResponse]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[GetPlansInCatalogResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/plans",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetPlansInCatalogResponse,
+ parse_obj_as(
+ type_=GetPlansInCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def add_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[None]
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/plans/{encode_path_param(plan_id)}",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return AsyncHttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
+ async def remove_plan(
+ self, catalog_id: str, plan_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[None]:
+ """
+ Parameters
+ ----------
+ catalog_id : str
+ catalog_id
+
+ plan_id : str
+ plan_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[None]
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"catalogs/{encode_path_param(catalog_id)}/plans/{encode_path_param(plan_id)}",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return AsyncHttpResponse(response=_response, data=None)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
diff --git a/src/schematic/catalogs/types/__init__.py b/src/schematic/catalogs/types/__init__.py
new file mode 100644
index 0000000..b3134c8
--- /dev/null
+++ b/src/schematic/catalogs/types/__init__.py
@@ -0,0 +1,68 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
+import typing
+from importlib import import_module
+
+if typing.TYPE_CHECKING:
+ from .create_catalog_response import CreateCatalogResponse
+ from .delete_catalog_response import DeleteCatalogResponse
+ from .get_catalog_response import GetCatalogResponse
+ from .get_configuration_response import GetConfigurationResponse
+ from .get_credit_bundles_in_catalog_response import GetCreditBundlesInCatalogResponse
+ from .get_derived_features_response import GetDerivedFeaturesResponse
+ from .get_plans_in_catalog_response import GetPlansInCatalogResponse
+ from .list_catalogs_params import ListCatalogsParams
+ from .list_catalogs_response import ListCatalogsResponse
+ from .update_catalog_response import UpdateCatalogResponse
+ from .update_configuration_response import UpdateConfigurationResponse
+_dynamic_imports: typing.Dict[str, str] = {
+ "CreateCatalogResponse": ".create_catalog_response",
+ "DeleteCatalogResponse": ".delete_catalog_response",
+ "GetCatalogResponse": ".get_catalog_response",
+ "GetConfigurationResponse": ".get_configuration_response",
+ "GetCreditBundlesInCatalogResponse": ".get_credit_bundles_in_catalog_response",
+ "GetDerivedFeaturesResponse": ".get_derived_features_response",
+ "GetPlansInCatalogResponse": ".get_plans_in_catalog_response",
+ "ListCatalogsParams": ".list_catalogs_params",
+ "ListCatalogsResponse": ".list_catalogs_response",
+ "UpdateCatalogResponse": ".update_catalog_response",
+ "UpdateConfigurationResponse": ".update_configuration_response",
+}
+
+
+def __getattr__(attr_name: str) -> typing.Any:
+ module_name = _dynamic_imports.get(attr_name)
+ if module_name is None:
+ raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}")
+ try:
+ module = import_module(module_name, __package__)
+ if module_name == f".{attr_name}":
+ return module
+ else:
+ return getattr(module, attr_name)
+ except ImportError as e:
+ raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e
+ except AttributeError as e:
+ raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e
+
+
+def __dir__():
+ lazy_attrs = list(_dynamic_imports.keys())
+ return sorted(lazy_attrs)
+
+
+__all__ = [
+ "CreateCatalogResponse",
+ "DeleteCatalogResponse",
+ "GetCatalogResponse",
+ "GetConfigurationResponse",
+ "GetCreditBundlesInCatalogResponse",
+ "GetDerivedFeaturesResponse",
+ "GetPlansInCatalogResponse",
+ "ListCatalogsParams",
+ "ListCatalogsResponse",
+ "UpdateCatalogResponse",
+ "UpdateConfigurationResponse",
+]
diff --git a/src/schematic/catalogs/types/create_catalog_response.py b/src/schematic/catalogs/types/create_catalog_response.py
new file mode 100644
index 0000000..2fadf68
--- /dev/null
+++ b/src/schematic/catalogs/types/create_catalog_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_response_data import CatalogResponseData
+
+
+class CreateCatalogResponse(UniversalBaseModel):
+ data: CatalogResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/delete_catalog_response.py b/src/schematic/catalogs/types/delete_catalog_response.py
new file mode 100644
index 0000000..ea16c1f
--- /dev/null
+++ b/src/schematic/catalogs/types/delete_catalog_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.delete_response import DeleteResponse
+
+
+class DeleteCatalogResponse(UniversalBaseModel):
+ data: DeleteResponse
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/get_catalog_response.py b/src/schematic/catalogs/types/get_catalog_response.py
new file mode 100644
index 0000000..cd4630c
--- /dev/null
+++ b/src/schematic/catalogs/types/get_catalog_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_response_data import CatalogResponseData
+
+
+class GetCatalogResponse(UniversalBaseModel):
+ data: CatalogResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/get_configuration_response.py b/src/schematic/catalogs/types/get_configuration_response.py
new file mode 100644
index 0000000..12aae28
--- /dev/null
+++ b/src/schematic/catalogs/types/get_configuration_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_configuration_response_data import CatalogConfigurationResponseData
+
+
+class GetConfigurationResponse(UniversalBaseModel):
+ data: CatalogConfigurationResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/get_credit_bundles_in_catalog_response.py b/src/schematic/catalogs/types/get_credit_bundles_in_catalog_response.py
new file mode 100644
index 0000000..86cc984
--- /dev/null
+++ b/src/schematic/catalogs/types/get_credit_bundles_in_catalog_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_credit_bundle_i_ds_response_data import CatalogCreditBundleIDsResponseData
+
+
+class GetCreditBundlesInCatalogResponse(UniversalBaseModel):
+ data: CatalogCreditBundleIDsResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/get_derived_features_response.py b/src/schematic/catalogs/types/get_derived_features_response.py
new file mode 100644
index 0000000..2272c8e
--- /dev/null
+++ b/src/schematic/catalogs/types/get_derived_features_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_derived_features_response_data import CatalogDerivedFeaturesResponseData
+
+
+class GetDerivedFeaturesResponse(UniversalBaseModel):
+ data: CatalogDerivedFeaturesResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/get_plans_in_catalog_response.py b/src/schematic/catalogs/types/get_plans_in_catalog_response.py
new file mode 100644
index 0000000..026dbaa
--- /dev/null
+++ b/src/schematic/catalogs/types/get_plans_in_catalog_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_plan_i_ds_response_data import CatalogPlanIDsResponseData
+
+
+class GetPlansInCatalogResponse(UniversalBaseModel):
+ data: CatalogPlanIDsResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/list_catalogs_params.py b/src/schematic/catalogs/types/list_catalogs_params.py
new file mode 100644
index 0000000..d780840
--- /dev/null
+++ b/src/schematic/catalogs/types/list_catalogs_params.py
@@ -0,0 +1,37 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class ListCatalogsParams(UniversalBaseModel):
+ """
+ Input parameters
+ """
+
+ is_default: typing.Optional[bool] = None
+ limit: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Page limit (default 100)
+ """
+
+ offset: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Page offset (default 0)
+ """
+
+ q: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Search by catalog name
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/list_catalogs_response.py b/src/schematic/catalogs/types/list_catalogs_response.py
new file mode 100644
index 0000000..6804246
--- /dev/null
+++ b/src/schematic/catalogs/types/list_catalogs_response.py
@@ -0,0 +1,25 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_response_data import CatalogResponseData
+from .list_catalogs_params import ListCatalogsParams
+
+
+class ListCatalogsResponse(UniversalBaseModel):
+ data: typing.List[CatalogResponseData]
+ params: ListCatalogsParams = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/update_catalog_response.py b/src/schematic/catalogs/types/update_catalog_response.py
new file mode 100644
index 0000000..54500cd
--- /dev/null
+++ b/src/schematic/catalogs/types/update_catalog_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_response_data import CatalogResponseData
+
+
+class UpdateCatalogResponse(UniversalBaseModel):
+ data: CatalogResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/catalogs/types/update_configuration_response.py b/src/schematic/catalogs/types/update_configuration_response.py
new file mode 100644
index 0000000..0e05ba5
--- /dev/null
+++ b/src/schematic/catalogs/types/update_configuration_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.catalog_response_data import CatalogResponseData
+
+
+class UpdateConfigurationResponse(UniversalBaseModel):
+ data: CatalogResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/companies/client.py b/src/schematic/companies/client.py
index aa396ca..94a71ab 100644
--- a/src/schematic/companies/client.py
+++ b/src/schematic/companies/client.py
@@ -229,6 +229,8 @@ def upsert_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -243,6 +245,12 @@ def upsert_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -278,6 +286,8 @@ def upsert_company(
"""
_response = self._raw_client.upsert_company(
keys=keys,
+ base_plan_id=base_plan_id,
+ base_plan_price_id=base_plan_price_id,
id=id,
last_seen_at=last_seen_at,
name=name,
@@ -520,6 +530,8 @@ def create_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -534,6 +546,12 @@ def create_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -569,6 +587,8 @@ def create_company(
"""
_response = self._raw_client.create_company(
keys=keys,
+ base_plan_id=base_plan_id,
+ base_plan_price_id=base_plan_price_id,
id=id,
last_seen_at=last_seen_at,
name=name,
@@ -2299,6 +2319,8 @@ async def upsert_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -2313,6 +2335,12 @@ async def upsert_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -2356,6 +2384,8 @@ async def main() -> None:
"""
_response = await self._raw_client.upsert_company(
keys=keys,
+ base_plan_id=base_plan_id,
+ base_plan_price_id=base_plan_price_id,
id=id,
last_seen_at=last_seen_at,
name=name,
@@ -2622,6 +2652,8 @@ async def create_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -2636,6 +2668,12 @@ async def create_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -2679,6 +2717,8 @@ async def main() -> None:
"""
_response = await self._raw_client.create_company(
keys=keys,
+ base_plan_id=base_plan_id,
+ base_plan_price_id=base_plan_price_id,
id=id,
last_seen_at=last_seen_at,
name=name,
diff --git a/src/schematic/companies/raw_client.py b/src/schematic/companies/raw_client.py
index 8a8d119..8b7267a 100644
--- a/src/schematic/companies/raw_client.py
+++ b/src/schematic/companies/raw_client.py
@@ -281,6 +281,8 @@ def upsert_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -295,6 +297,12 @@ def upsert_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -321,6 +329,8 @@ def upsert_company(
"companies",
method="POST",
json={
+ "base_plan_id": base_plan_id,
+ "base_plan_price_id": base_plan_price_id,
"id": id,
"keys": keys,
"last_seen_at": last_seen_at,
@@ -822,6 +832,8 @@ def create_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -836,6 +848,12 @@ def create_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -862,6 +880,8 @@ def create_company(
"companies/create",
method="POST",
json={
+ "base_plan_id": base_plan_id,
+ "base_plan_price_id": base_plan_price_id,
"id": id,
"keys": keys,
"last_seen_at": last_seen_at,
@@ -4870,6 +4890,8 @@ async def upsert_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -4884,6 +4906,12 @@ async def upsert_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -4910,6 +4938,8 @@ async def upsert_company(
"companies",
method="POST",
json={
+ "base_plan_id": base_plan_id,
+ "base_plan_price_id": base_plan_price_id,
"id": id,
"keys": keys,
"last_seen_at": last_seen_at,
@@ -5411,6 +5441,8 @@ async def create_company(
self,
*,
keys: typing.Dict[str, str],
+ base_plan_id: typing.Optional[str] = OMIT,
+ base_plan_price_id: typing.Optional[str] = OMIT,
id: typing.Optional[str] = OMIT,
last_seen_at: typing.Optional[dt.datetime] = OMIT,
name: typing.Optional[str] = OMIT,
@@ -5425,6 +5457,12 @@ async def create_company(
keys : typing.Dict[str, str]
See [Key Management](https://docs.schematichq.com/developer_resources/key_management) for more information
+ base_plan_id : typing.Optional[str]
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+
+ base_plan_price_id : typing.Optional[str]
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+
id : typing.Optional[str]
If you know the Schematic ID, you can use that here instead of keys
@@ -5451,6 +5489,8 @@ async def create_company(
"companies/create",
method="POST",
json={
+ "base_plan_id": base_plan_id,
+ "base_plan_price_id": base_plan_price_id,
"id": id,
"keys": keys,
"last_seen_at": last_seen_at,
diff --git a/src/schematic/components/__init__.py b/src/schematic/components/__init__.py
index 8e8dcba..53796bd 100644
--- a/src/schematic/components/__init__.py
+++ b/src/schematic/components/__init__.py
@@ -7,6 +7,7 @@
if typing.TYPE_CHECKING:
from .types import (
+ BindCatalogResponse,
CountComponentsParams,
CountComponentsResponse,
CreateComponentResponse,
@@ -19,6 +20,7 @@
UpdateComponentResponse,
)
_dynamic_imports: typing.Dict[str, str] = {
+ "BindCatalogResponse": ".types",
"CountComponentsParams": ".types",
"CountComponentsResponse": ".types",
"CreateComponentResponse": ".types",
@@ -54,6 +56,7 @@ def __dir__():
__all__ = [
+ "BindCatalogResponse",
"CountComponentsParams",
"CountComponentsResponse",
"CreateComponentResponse",
diff --git a/src/schematic/components/client.py b/src/schematic/components/client.py
index 46df164..d2d8828 100644
--- a/src/schematic/components/client.py
+++ b/src/schematic/components/client.py
@@ -7,6 +7,7 @@
from ..types.component_entity_type import ComponentEntityType
from ..types.component_state import ComponentState
from .raw_client import AsyncRawComponentsClient, RawComponentsClient
+from .types.bind_catalog_response import BindCatalogResponse
from .types.count_components_response import CountComponentsResponse
from .types.create_component_response import CreateComponentResponse
from .types.delete_component_response import DeleteComponentResponse
@@ -229,6 +230,43 @@ def delete_component(
_response = self._raw_client.delete_component(component_id, request_options=request_options)
return _response.data
+ def bind_catalog(
+ self,
+ component_id: str,
+ *,
+ catalog_id: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> BindCatalogResponse:
+ """
+ Parameters
+ ----------
+ component_id : str
+ component_id
+
+ catalog_id : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ BindCatalogResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.components.bind_catalog(
+ component_id="component_id",
+ )
+ """
+ _response = self._raw_client.bind_catalog(component_id, catalog_id=catalog_id, request_options=request_options)
+ return _response.data
+
def count_components(
self,
*,
@@ -564,6 +602,53 @@ async def main() -> None:
_response = await self._raw_client.delete_component(component_id, request_options=request_options)
return _response.data
+ async def bind_catalog(
+ self,
+ component_id: str,
+ *,
+ catalog_id: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> BindCatalogResponse:
+ """
+ Parameters
+ ----------
+ component_id : str
+ component_id
+
+ catalog_id : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ BindCatalogResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.components.bind_catalog(
+ component_id="component_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.bind_catalog(
+ component_id, catalog_id=catalog_id, request_options=request_options
+ )
+ return _response.data
+
async def count_components(
self,
*,
diff --git a/src/schematic/components/raw_client.py b/src/schematic/components/raw_client.py
index 4857021..f457060 100644
--- a/src/schematic/components/raw_client.py
+++ b/src/schematic/components/raw_client.py
@@ -18,6 +18,7 @@
from ..types.api_error import ApiError as types_api_error_ApiError
from ..types.component_entity_type import ComponentEntityType
from ..types.component_state import ComponentState
+from .types.bind_catalog_response import BindCatalogResponse
from .types.count_components_response import CountComponentsResponse
from .types.create_component_response import CreateComponentResponse
from .types.delete_component_response import DeleteComponentResponse
@@ -581,6 +582,119 @@ def delete_component(
status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
)
+ def bind_catalog(
+ self,
+ component_id: str,
+ *,
+ catalog_id: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[BindCatalogResponse]:
+ """
+ Parameters
+ ----------
+ component_id : str
+ component_id
+
+ catalog_id : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[BindCatalogResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"components/{encode_path_param(component_id)}/catalog",
+ method="PUT",
+ json={
+ "catalog_id": catalog_id,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ BindCatalogResponse,
+ parse_obj_as(
+ type_=BindCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
def count_components(
self,
*,
@@ -1345,6 +1459,119 @@ async def delete_component(
status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
)
+ async def bind_catalog(
+ self,
+ component_id: str,
+ *,
+ catalog_id: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[BindCatalogResponse]:
+ """
+ Parameters
+ ----------
+ component_id : str
+ component_id
+
+ catalog_id : typing.Optional[str]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[BindCatalogResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"components/{encode_path_param(component_id)}/catalog",
+ method="PUT",
+ json={
+ "catalog_id": catalog_id,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ BindCatalogResponse,
+ parse_obj_as(
+ type_=BindCatalogResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
async def count_components(
self,
*,
diff --git a/src/schematic/components/types/__init__.py b/src/schematic/components/types/__init__.py
index 34aa0f5..ebf4159 100644
--- a/src/schematic/components/types/__init__.py
+++ b/src/schematic/components/types/__init__.py
@@ -6,6 +6,7 @@
from importlib import import_module
if typing.TYPE_CHECKING:
+ from .bind_catalog_response import BindCatalogResponse
from .count_components_params import CountComponentsParams
from .count_components_response import CountComponentsResponse
from .create_component_response import CreateComponentResponse
@@ -17,6 +18,7 @@
from .preview_component_data_response import PreviewComponentDataResponse
from .update_component_response import UpdateComponentResponse
_dynamic_imports: typing.Dict[str, str] = {
+ "BindCatalogResponse": ".bind_catalog_response",
"CountComponentsParams": ".count_components_params",
"CountComponentsResponse": ".count_components_response",
"CreateComponentResponse": ".create_component_response",
@@ -52,6 +54,7 @@ def __dir__():
__all__ = [
+ "BindCatalogResponse",
"CountComponentsParams",
"CountComponentsResponse",
"CreateComponentResponse",
diff --git a/src/schematic/components/types/bind_catalog_response.py b/src/schematic/components/types/bind_catalog_response.py
new file mode 100644
index 0000000..4162ba6
--- /dev/null
+++ b/src/schematic/components/types/bind_catalog_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.component_response_data import ComponentResponseData
+
+
+class BindCatalogResponse(UniversalBaseModel):
+ data: ComponentResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/dataexports/__init__.py b/src/schematic/dataexports/__init__.py
index 2c0f0da..23ab9c2 100644
--- a/src/schematic/dataexports/__init__.py
+++ b/src/schematic/dataexports/__init__.py
@@ -6,8 +6,13 @@
from importlib import import_module
if typing.TYPE_CHECKING:
- from .types import CreateDataExportResponse
-_dynamic_imports: typing.Dict[str, str] = {"CreateDataExportResponse": ".types"}
+ from .types import CreateDataExportResponse, GetDataExportResponse, ListDataExportsParams, ListDataExportsResponse
+_dynamic_imports: typing.Dict[str, str] = {
+ "CreateDataExportResponse": ".types",
+ "GetDataExportResponse": ".types",
+ "ListDataExportsParams": ".types",
+ "ListDataExportsResponse": ".types",
+}
def __getattr__(attr_name: str) -> typing.Any:
@@ -31,4 +36,4 @@ def __dir__():
return sorted(lazy_attrs)
-__all__ = ["CreateDataExportResponse"]
+__all__ = ["CreateDataExportResponse", "GetDataExportResponse", "ListDataExportsParams", "ListDataExportsResponse"]
diff --git a/src/schematic/dataexports/client.py b/src/schematic/dataexports/client.py
index 6424cc4..0503677 100644
--- a/src/schematic/dataexports/client.py
+++ b/src/schematic/dataexports/client.py
@@ -4,8 +4,14 @@
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.request_options import RequestOptions
+from ..types.data_export_metadata import DataExportMetadata
+from ..types.data_export_output_file_type import DataExportOutputFileType
+from ..types.data_export_status import DataExportStatus
+from ..types.data_export_type import DataExportType
from .raw_client import AsyncRawDataexportsClient, RawDataexportsClient
from .types.create_data_export_response import CreateDataExportResponse
+from .types.get_data_export_response import GetDataExportResponse
+from .types.list_data_exports_response import ListDataExportsResponse
# this is used as the default value for optional parameters
OMIT = typing.cast(typing.Any, ...)
@@ -26,13 +32,71 @@ def with_raw_response(self) -> RawDataexportsClient:
"""
return self._raw_client
+ def list_data_exports(
+ self,
+ *,
+ export_type: typing.Optional[DataExportType] = None,
+ status: typing.Optional[DataExportStatus] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ListDataExportsResponse:
+ """
+ Parameters
+ ----------
+ export_type : typing.Optional[DataExportType]
+
+ status : typing.Optional[DataExportStatus]
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ListDataExportsResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.dataexports.list_data_exports(
+ export_type="audit-log",
+ status="failure",
+ limit=1000000,
+ offset=1000000,
+ )
+ """
+ _response = self._raw_client.list_data_exports(
+ export_type=export_type, status=status, limit=limit, offset=offset, request_options=request_options
+ )
+ return _response.data
+
def create_data_export(
- self, *, metadata: str, request_options: typing.Optional[RequestOptions] = None
+ self,
+ *,
+ export_type: DataExportType,
+ output_file_type: DataExportOutputFileType,
+ metadata: typing.Optional[DataExportMetadata] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
) -> CreateDataExportResponse:
"""
Parameters
----------
- metadata : str
+ export_type : DataExportType
+
+ output_file_type : DataExportOutputFileType
+
+ metadata : typing.Optional[DataExportMetadata]
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -50,10 +114,47 @@ def create_data_export(
api_key="YOUR_API_KEY",
)
client.dataexports.create_data_export(
- metadata="metadata",
+ export_type="audit-log",
+ output_file_type="csv",
)
"""
- _response = self._raw_client.create_data_export(metadata=metadata, request_options=request_options)
+ _response = self._raw_client.create_data_export(
+ export_type=export_type,
+ output_file_type=output_file_type,
+ metadata=metadata,
+ request_options=request_options,
+ )
+ return _response.data
+
+ def get_data_export(
+ self, data_export_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetDataExportResponse:
+ """
+ Parameters
+ ----------
+ data_export_id : str
+ data_export_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetDataExportResponse
+ OK
+
+ Examples
+ --------
+ from schematic import Schematic
+
+ client = Schematic(
+ api_key="YOUR_API_KEY",
+ )
+ client.dataexports.get_data_export(
+ data_export_id="data_export_id",
+ )
+ """
+ _response = self._raw_client.get_data_export(data_export_id, request_options=request_options)
return _response.data
def get_data_export_artifact(
@@ -103,13 +204,79 @@ def with_raw_response(self) -> AsyncRawDataexportsClient:
"""
return self._raw_client
+ async def list_data_exports(
+ self,
+ *,
+ export_type: typing.Optional[DataExportType] = None,
+ status: typing.Optional[DataExportStatus] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ListDataExportsResponse:
+ """
+ Parameters
+ ----------
+ export_type : typing.Optional[DataExportType]
+
+ status : typing.Optional[DataExportStatus]
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ListDataExportsResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.dataexports.list_data_exports(
+ export_type="audit-log",
+ status="failure",
+ limit=1000000,
+ offset=1000000,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list_data_exports(
+ export_type=export_type, status=status, limit=limit, offset=offset, request_options=request_options
+ )
+ return _response.data
+
async def create_data_export(
- self, *, metadata: str, request_options: typing.Optional[RequestOptions] = None
+ self,
+ *,
+ export_type: DataExportType,
+ output_file_type: DataExportOutputFileType,
+ metadata: typing.Optional[DataExportMetadata] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
) -> CreateDataExportResponse:
"""
Parameters
----------
- metadata : str
+ export_type : DataExportType
+
+ output_file_type : DataExportOutputFileType
+
+ metadata : typing.Optional[DataExportMetadata]
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -132,13 +299,58 @@ async def create_data_export(
async def main() -> None:
await client.dataexports.create_data_export(
- metadata="metadata",
+ export_type="audit-log",
+ output_file_type="csv",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create_data_export(
+ export_type=export_type,
+ output_file_type=output_file_type,
+ metadata=metadata,
+ request_options=request_options,
+ )
+ return _response.data
+
+ async def get_data_export(
+ self, data_export_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> GetDataExportResponse:
+ """
+ Parameters
+ ----------
+ data_export_id : str
+ data_export_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ GetDataExportResponse
+ OK
+
+ Examples
+ --------
+ import asyncio
+
+ from schematic import AsyncSchematic
+
+ client = AsyncSchematic(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.dataexports.get_data_export(
+ data_export_id="data_export_id",
)
asyncio.run(main())
"""
- _response = await self._raw_client.create_data_export(metadata=metadata, request_options=request_options)
+ _response = await self._raw_client.get_data_export(data_export_id, request_options=request_options)
return _response.data
async def get_data_export_artifact(
diff --git a/src/schematic/dataexports/raw_client.py b/src/schematic/dataexports/raw_client.py
index b5d39b8..e4a9997 100644
--- a/src/schematic/dataexports/raw_client.py
+++ b/src/schematic/dataexports/raw_client.py
@@ -11,13 +11,20 @@
from ..core.parse_error import ParsingError
from ..core.pydantic_utilities import parse_obj_as
from ..core.request_options import RequestOptions
+from ..core.serialization import convert_and_respect_annotation_metadata
from ..errors.bad_request_error import BadRequestError
from ..errors.forbidden_error import ForbiddenError
from ..errors.internal_server_error import InternalServerError
from ..errors.not_found_error import NotFoundError
from ..errors.unauthorized_error import UnauthorizedError
from ..types.api_error import ApiError as types_api_error_ApiError
+from ..types.data_export_metadata import DataExportMetadata
+from ..types.data_export_output_file_type import DataExportOutputFileType
+from ..types.data_export_status import DataExportStatus
+from ..types.data_export_type import DataExportType
from .types.create_data_export_response import CreateDataExportResponse
+from .types.get_data_export_response import GetDataExportResponse
+from .types.list_data_exports_response import ListDataExportsResponse
from pydantic import ValidationError
# this is used as the default value for optional parameters
@@ -28,13 +35,141 @@ class RawDataexportsClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
self._client_wrapper = client_wrapper
+ def list_data_exports(
+ self,
+ *,
+ export_type: typing.Optional[DataExportType] = None,
+ status: typing.Optional[DataExportStatus] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[ListDataExportsResponse]:
+ """
+ Parameters
+ ----------
+ export_type : typing.Optional[DataExportType]
+
+ status : typing.Optional[DataExportStatus]
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ListDataExportsResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "data-exports",
+ method="GET",
+ params={
+ "export_type": export_type,
+ "status": status,
+ "limit": limit,
+ "offset": offset,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ListDataExportsResponse,
+ parse_obj_as(
+ type_=ListDataExportsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
def create_data_export(
- self, *, metadata: str, request_options: typing.Optional[RequestOptions] = None
+ self,
+ *,
+ export_type: DataExportType,
+ output_file_type: DataExportOutputFileType,
+ metadata: typing.Optional[DataExportMetadata] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[CreateDataExportResponse]:
"""
Parameters
----------
- metadata : str
+ export_type : DataExportType
+
+ output_file_type : DataExportOutputFileType
+
+ metadata : typing.Optional[DataExportMetadata]
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -48,9 +183,11 @@ def create_data_export(
"data-exports",
method="POST",
json={
- "metadata": metadata,
- "export_type": "company-feature-usage",
- "output_file_type": "csv",
+ "export_type": export_type,
+ "metadata": convert_and_respect_annotation_metadata(
+ object_=metadata, annotation=DataExportMetadata, direction="write"
+ ),
+ "output_file_type": output_file_type,
},
headers={
"content-type": "application/json",
@@ -136,6 +273,95 @@ def create_data_export(
status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
)
+ def get_data_export(
+ self, data_export_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[GetDataExportResponse]:
+ """
+ Parameters
+ ----------
+ data_export_id : str
+ data_export_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[GetDataExportResponse]
+ OK
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"data-exports/{encode_path_param(data_export_id)}",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetDataExportResponse,
+ parse_obj_as(
+ type_=GetDataExportResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
@contextlib.contextmanager
def get_data_export_artifact(
self, data_export_id: str, *, request_options: typing.Optional[RequestOptions] = None
@@ -235,13 +461,141 @@ class AsyncRawDataexportsClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
self._client_wrapper = client_wrapper
+ async def list_data_exports(
+ self,
+ *,
+ export_type: typing.Optional[DataExportType] = None,
+ status: typing.Optional[DataExportStatus] = None,
+ limit: typing.Optional[int] = None,
+ offset: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[ListDataExportsResponse]:
+ """
+ Parameters
+ ----------
+ export_type : typing.Optional[DataExportType]
+
+ status : typing.Optional[DataExportStatus]
+
+ limit : typing.Optional[int]
+ Page limit (default 100)
+
+ offset : typing.Optional[int]
+ Page offset (default 0)
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ListDataExportsResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "data-exports",
+ method="GET",
+ params={
+ "export_type": export_type,
+ "status": status,
+ "limit": limit,
+ "offset": offset,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ListDataExportsResponse,
+ parse_obj_as(
+ type_=ListDataExportsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
async def create_data_export(
- self, *, metadata: str, request_options: typing.Optional[RequestOptions] = None
+ self,
+ *,
+ export_type: DataExportType,
+ output_file_type: DataExportOutputFileType,
+ metadata: typing.Optional[DataExportMetadata] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[CreateDataExportResponse]:
"""
Parameters
----------
- metadata : str
+ export_type : DataExportType
+
+ output_file_type : DataExportOutputFileType
+
+ metadata : typing.Optional[DataExportMetadata]
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -255,9 +609,11 @@ async def create_data_export(
"data-exports",
method="POST",
json={
- "metadata": metadata,
- "export_type": "company-feature-usage",
- "output_file_type": "csv",
+ "export_type": export_type,
+ "metadata": convert_and_respect_annotation_metadata(
+ object_=metadata, annotation=DataExportMetadata, direction="write"
+ ),
+ "output_file_type": output_file_type,
},
headers={
"content-type": "application/json",
@@ -343,6 +699,95 @@ async def create_data_export(
status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
)
+ async def get_data_export(
+ self, data_export_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[GetDataExportResponse]:
+ """
+ Parameters
+ ----------
+ data_export_id : str
+ data_export_id
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[GetDataExportResponse]
+ OK
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"data-exports/{encode_path_param(data_export_id)}",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ GetDataExportResponse,
+ parse_obj_as(
+ type_=GetDataExportResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ types_api_error_ApiError,
+ parse_obj_as(
+ type_=types_api_error_ApiError, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
+ )
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise core_api_error_ApiError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response_json
+ )
+
@contextlib.asynccontextmanager
async def get_data_export_artifact(
self, data_export_id: str, *, request_options: typing.Optional[RequestOptions] = None
diff --git a/src/schematic/dataexports/types/__init__.py b/src/schematic/dataexports/types/__init__.py
index b7cbb54..cc08b50 100644
--- a/src/schematic/dataexports/types/__init__.py
+++ b/src/schematic/dataexports/types/__init__.py
@@ -7,7 +7,15 @@
if typing.TYPE_CHECKING:
from .create_data_export_response import CreateDataExportResponse
-_dynamic_imports: typing.Dict[str, str] = {"CreateDataExportResponse": ".create_data_export_response"}
+ from .get_data_export_response import GetDataExportResponse
+ from .list_data_exports_params import ListDataExportsParams
+ from .list_data_exports_response import ListDataExportsResponse
+_dynamic_imports: typing.Dict[str, str] = {
+ "CreateDataExportResponse": ".create_data_export_response",
+ "GetDataExportResponse": ".get_data_export_response",
+ "ListDataExportsParams": ".list_data_exports_params",
+ "ListDataExportsResponse": ".list_data_exports_response",
+}
def __getattr__(attr_name: str) -> typing.Any:
@@ -31,4 +39,4 @@ def __dir__():
return sorted(lazy_attrs)
-__all__ = ["CreateDataExportResponse"]
+__all__ = ["CreateDataExportResponse", "GetDataExportResponse", "ListDataExportsParams", "ListDataExportsResponse"]
diff --git a/src/schematic/dataexports/types/get_data_export_response.py b/src/schematic/dataexports/types/get_data_export_response.py
new file mode 100644
index 0000000..c36aa5d
--- /dev/null
+++ b/src/schematic/dataexports/types/get_data_export_response.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.data_export_response_data import DataExportResponseData
+
+
+class GetDataExportResponse(UniversalBaseModel):
+ data: DataExportResponseData
+ params: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/dataexports/types/list_data_exports_params.py b/src/schematic/dataexports/types/list_data_exports_params.py
new file mode 100644
index 0000000..b310f59
--- /dev/null
+++ b/src/schematic/dataexports/types/list_data_exports_params.py
@@ -0,0 +1,36 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.data_export_status import DataExportStatus
+from ...types.data_export_type import DataExportType
+
+
+class ListDataExportsParams(UniversalBaseModel):
+ """
+ Input parameters
+ """
+
+ export_type: typing.Optional[DataExportType] = None
+ limit: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Page limit (default 100)
+ """
+
+ offset: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Page offset (default 0)
+ """
+
+ status: typing.Optional[DataExportStatus] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/dataexports/types/list_data_exports_response.py b/src/schematic/dataexports/types/list_data_exports_response.py
new file mode 100644
index 0000000..c73244d
--- /dev/null
+++ b/src/schematic/dataexports/types/list_data_exports_response.py
@@ -0,0 +1,25 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.data_export_response_data import DataExportResponseData
+from .list_data_exports_params import ListDataExportsParams
+
+
+class ListDataExportsResponse(UniversalBaseModel):
+ data: typing.List[DataExportResponseData]
+ params: ListDataExportsParams = pydantic.Field()
+ """
+ Input parameters
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/planbundle/client.py b/src/schematic/planbundle/client.py
index aa84b40..9b5e2fa 100644
--- a/src/schematic/planbundle/client.py
+++ b/src/schematic/planbundle/client.py
@@ -39,6 +39,7 @@ def create_custom_plan_bundle(
*,
entitlements: typing.Sequence[PlanBundleEntitlementRequestBody],
billing_product: typing.Optional[UpsertBillingProductRequestBody] = OMIT,
+ credit_grants: typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]] = OMIT,
plan: typing.Optional[CreateCustomPlanBundlePlanRequestBody] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> CreateCustomPlanBundleResponse:
@@ -49,6 +50,8 @@ def create_custom_plan_bundle(
billing_product : typing.Optional[UpsertBillingProductRequestBody]
+ credit_grants : typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]]
+
plan : typing.Optional[CreateCustomPlanBundlePlanRequestBody]
request_options : typing.Optional[RequestOptions]
@@ -75,7 +78,11 @@ def create_custom_plan_bundle(
)
"""
_response = self._raw_client.create_custom_plan_bundle(
- entitlements=entitlements, billing_product=billing_product, plan=plan, request_options=request_options
+ entitlements=entitlements,
+ billing_product=billing_product,
+ credit_grants=credit_grants,
+ plan=plan,
+ request_options=request_options,
)
return _response.data
@@ -214,6 +221,7 @@ async def create_custom_plan_bundle(
*,
entitlements: typing.Sequence[PlanBundleEntitlementRequestBody],
billing_product: typing.Optional[UpsertBillingProductRequestBody] = OMIT,
+ credit_grants: typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]] = OMIT,
plan: typing.Optional[CreateCustomPlanBundlePlanRequestBody] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> CreateCustomPlanBundleResponse:
@@ -224,6 +232,8 @@ async def create_custom_plan_bundle(
billing_product : typing.Optional[UpsertBillingProductRequestBody]
+ credit_grants : typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]]
+
plan : typing.Optional[CreateCustomPlanBundlePlanRequestBody]
request_options : typing.Optional[RequestOptions]
@@ -258,7 +268,11 @@ async def main() -> None:
asyncio.run(main())
"""
_response = await self._raw_client.create_custom_plan_bundle(
- entitlements=entitlements, billing_product=billing_product, plan=plan, request_options=request_options
+ entitlements=entitlements,
+ billing_product=billing_product,
+ credit_grants=credit_grants,
+ plan=plan,
+ request_options=request_options,
)
return _response.data
diff --git a/src/schematic/planbundle/raw_client.py b/src/schematic/planbundle/raw_client.py
index 65be3b7..886efa9 100644
--- a/src/schematic/planbundle/raw_client.py
+++ b/src/schematic/planbundle/raw_client.py
@@ -41,6 +41,7 @@ def create_custom_plan_bundle(
*,
entitlements: typing.Sequence[PlanBundleEntitlementRequestBody],
billing_product: typing.Optional[UpsertBillingProductRequestBody] = OMIT,
+ credit_grants: typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]] = OMIT,
plan: typing.Optional[CreateCustomPlanBundlePlanRequestBody] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[CreateCustomPlanBundleResponse]:
@@ -51,6 +52,8 @@ def create_custom_plan_bundle(
billing_product : typing.Optional[UpsertBillingProductRequestBody]
+ credit_grants : typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]]
+
plan : typing.Optional[CreateCustomPlanBundlePlanRequestBody]
request_options : typing.Optional[RequestOptions]
@@ -68,6 +71,11 @@ def create_custom_plan_bundle(
"billing_product": convert_and_respect_annotation_metadata(
object_=billing_product, annotation=UpsertBillingProductRequestBody, direction="write"
),
+ "credit_grants": convert_and_respect_annotation_metadata(
+ object_=credit_grants,
+ annotation=typing.Sequence[PlanBundleCreditGrantRequestBody],
+ direction="write",
+ ),
"entitlements": convert_and_respect_annotation_metadata(
object_=entitlements,
annotation=typing.Sequence[PlanBundleEntitlementRequestBody],
@@ -445,6 +453,7 @@ async def create_custom_plan_bundle(
*,
entitlements: typing.Sequence[PlanBundleEntitlementRequestBody],
billing_product: typing.Optional[UpsertBillingProductRequestBody] = OMIT,
+ credit_grants: typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]] = OMIT,
plan: typing.Optional[CreateCustomPlanBundlePlanRequestBody] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[CreateCustomPlanBundleResponse]:
@@ -455,6 +464,8 @@ async def create_custom_plan_bundle(
billing_product : typing.Optional[UpsertBillingProductRequestBody]
+ credit_grants : typing.Optional[typing.Sequence[PlanBundleCreditGrantRequestBody]]
+
plan : typing.Optional[CreateCustomPlanBundlePlanRequestBody]
request_options : typing.Optional[RequestOptions]
@@ -472,6 +483,11 @@ async def create_custom_plan_bundle(
"billing_product": convert_and_respect_annotation_metadata(
object_=billing_product, annotation=UpsertBillingProductRequestBody, direction="write"
),
+ "credit_grants": convert_and_respect_annotation_metadata(
+ object_=credit_grants,
+ annotation=typing.Sequence[PlanBundleCreditGrantRequestBody],
+ direction="write",
+ ),
"entitlements": convert_and_respect_annotation_metadata(
object_=entitlements,
annotation=typing.Sequence[PlanBundleEntitlementRequestBody],
diff --git a/src/schematic/types/__init__.py b/src/schematic/types/__init__.py
index 50b508c..7e59b4e 100644
--- a/src/schematic/types/__init__.py
+++ b/src/schematic/types/__init__.py
@@ -17,6 +17,7 @@
from .api_key_integration_response_data import ApiKeyIntegrationResponseData
from .api_key_response_data import ApiKeyResponseData
from .api_key_scope import ApiKeyScope
+ from .audit_log_export_metadata import AuditLogExportMetadata
from .audit_log_list_response_data import AuditLogListResponseData
from .audit_log_response_data import AuditLogResponseData
from .billing_coupon_response_data import BillingCouponResponseData
@@ -67,6 +68,18 @@
from .billing_tiers_mode import BillingTiersMode
from .capture_raw_event import CaptureRawEvent
from .capture_raw_event_batch import CaptureRawEventBatch
+ from .catalog_config_ordered_bundle import CatalogConfigOrderedBundle
+ from .catalog_config_ordered_bundle_response_data import CatalogConfigOrderedBundleResponseData
+ from .catalog_config_ordered_entitlement import CatalogConfigOrderedEntitlement
+ from .catalog_config_ordered_entitlement_response_data import CatalogConfigOrderedEntitlementResponseData
+ from .catalog_config_ordered_plan import CatalogConfigOrderedPlan
+ from .catalog_config_ordered_plan_response_data import CatalogConfigOrderedPlanResponseData
+ from .catalog_configuration_response_data import CatalogConfigurationResponseData
+ from .catalog_credit_bundle_i_ds_response_data import CatalogCreditBundleIDsResponseData
+ from .catalog_derived_feature_response_data import CatalogDerivedFeatureResponseData
+ from .catalog_derived_features_response_data import CatalogDerivedFeaturesResponseData
+ from .catalog_plan_i_ds_response_data import CatalogPlanIDsResponseData
+ from .catalog_response_data import CatalogResponseData
from .change_subscription_internal_request_body import ChangeSubscriptionInternalRequestBody
from .change_subscription_request_body import ChangeSubscriptionRequestBody
from .charge_type import ChargeType
@@ -88,6 +101,7 @@
from .company_credit_balance_response_data import CompanyCreditBalanceResponseData
from .company_detail_response_data import CompanyDetailResponseData
from .company_event_period_metrics_response_data import CompanyEventPeriodMetricsResponseData
+ from .company_feature_usage_export_metadata import CompanyFeatureUsageExportMetadata
from .company_ledger_response_data import CompanyLedgerResponseData
from .company_matching_criteria import CompanyMatchingCriteria
from .company_membership_detail_response_data import CompanyMembershipDetailResponseData
@@ -166,6 +180,11 @@
from .custom_plan_config import CustomPlanConfig
from .custom_plan_view_config_response_data import CustomPlanViewConfigResponseData
from .data_event_payload import DataEventPayload
+ from .data_export_metadata import (
+ DataExportMetadata,
+ DataExportMetadata_AuditLog,
+ DataExportMetadata_CompanyFeatureUsage,
+ )
from .data_export_output_file_type import DataExportOutputFileType
from .data_export_response_data import DataExportResponseData
from .data_export_status import DataExportStatus
@@ -269,6 +288,7 @@
from .plan_bundle_credit_grant_request_body import PlanBundleCreditGrantRequestBody
from .plan_bundle_entitlement_request_body import PlanBundleEntitlementRequestBody
from .plan_bundle_response_data import PlanBundleResponseData
+ from .plan_catalog_membership_response_data import PlanCatalogMembershipResponseData
from .plan_change_action import PlanChangeAction
from .plan_change_base_plan_action import PlanChangeBasePlanAction
from .plan_change_response_data import PlanChangeResponseData
@@ -306,6 +326,7 @@
from .preview_object import PreviewObject
from .preview_object_response_data import PreviewObjectResponseData
from .preview_subscription_change_response_data import PreviewSubscriptionChangeResponseData
+ from .preview_subscription_discount_response_data import PreviewSubscriptionDiscountResponseData
from .preview_subscription_finance_response_data import PreviewSubscriptionFinanceResponseData
from .preview_subscription_upcoming_invoice_line_items import PreviewSubscriptionUpcomingInvoiceLineItems
from .proration_behavior import ProrationBehavior
@@ -344,6 +365,7 @@
from .rulesengine_trait_definition import RulesengineTraitDefinition
from .rulesengine_trait_definition_comparable_type import RulesengineTraitDefinitionComparableType
from .rulesengine_user import RulesengineUser
+ from .rulesengine_warning_tier import RulesengineWarningTier
from .scheduled_checkout_response_data import ScheduledCheckoutResponseData
from .scheduled_checkout_status import ScheduledCheckoutStatus
from .scheduled_downgrade_config_behavior import ScheduledDowngradeConfigBehavior
@@ -386,6 +408,7 @@
from .usage_time_series_point_response_data import UsageTimeSeriesPointResponseData
from .user_detail_response_data import UserDetailResponseData
from .user_response_data import UserResponseData
+ from .warning_tier import WarningTier
from .warning_tier_request_body import WarningTierRequestBody
from .warning_tier_response_data import WarningTierResponseData
from .web_feature_usage_webhook_output import WebFeatureUsageWebhookOutput
@@ -411,6 +434,7 @@
"ApiKeyIntegrationResponseData": ".api_key_integration_response_data",
"ApiKeyResponseData": ".api_key_response_data",
"ApiKeyScope": ".api_key_scope",
+ "AuditLogExportMetadata": ".audit_log_export_metadata",
"AuditLogListResponseData": ".audit_log_list_response_data",
"AuditLogResponseData": ".audit_log_response_data",
"BillingCouponResponseData": ".billing_coupon_response_data",
@@ -461,6 +485,18 @@
"BillingTiersMode": ".billing_tiers_mode",
"CaptureRawEvent": ".capture_raw_event",
"CaptureRawEventBatch": ".capture_raw_event_batch",
+ "CatalogConfigOrderedBundle": ".catalog_config_ordered_bundle",
+ "CatalogConfigOrderedBundleResponseData": ".catalog_config_ordered_bundle_response_data",
+ "CatalogConfigOrderedEntitlement": ".catalog_config_ordered_entitlement",
+ "CatalogConfigOrderedEntitlementResponseData": ".catalog_config_ordered_entitlement_response_data",
+ "CatalogConfigOrderedPlan": ".catalog_config_ordered_plan",
+ "CatalogConfigOrderedPlanResponseData": ".catalog_config_ordered_plan_response_data",
+ "CatalogConfigurationResponseData": ".catalog_configuration_response_data",
+ "CatalogCreditBundleIDsResponseData": ".catalog_credit_bundle_i_ds_response_data",
+ "CatalogDerivedFeatureResponseData": ".catalog_derived_feature_response_data",
+ "CatalogDerivedFeaturesResponseData": ".catalog_derived_features_response_data",
+ "CatalogPlanIDsResponseData": ".catalog_plan_i_ds_response_data",
+ "CatalogResponseData": ".catalog_response_data",
"ChangeSubscriptionInternalRequestBody": ".change_subscription_internal_request_body",
"ChangeSubscriptionRequestBody": ".change_subscription_request_body",
"ChargeType": ".charge_type",
@@ -482,6 +518,7 @@
"CompanyCreditBalanceResponseData": ".company_credit_balance_response_data",
"CompanyDetailResponseData": ".company_detail_response_data",
"CompanyEventPeriodMetricsResponseData": ".company_event_period_metrics_response_data",
+ "CompanyFeatureUsageExportMetadata": ".company_feature_usage_export_metadata",
"CompanyLedgerResponseData": ".company_ledger_response_data",
"CompanyMatchingCriteria": ".company_matching_criteria",
"CompanyMembershipDetailResponseData": ".company_membership_detail_response_data",
@@ -560,6 +597,9 @@
"CustomPlanConfig": ".custom_plan_config",
"CustomPlanViewConfigResponseData": ".custom_plan_view_config_response_data",
"DataEventPayload": ".data_event_payload",
+ "DataExportMetadata": ".data_export_metadata",
+ "DataExportMetadata_AuditLog": ".data_export_metadata",
+ "DataExportMetadata_CompanyFeatureUsage": ".data_export_metadata",
"DataExportOutputFileType": ".data_export_output_file_type",
"DataExportResponseData": ".data_export_response_data",
"DataExportStatus": ".data_export_status",
@@ -661,6 +701,7 @@
"PlanBundleCreditGrantRequestBody": ".plan_bundle_credit_grant_request_body",
"PlanBundleEntitlementRequestBody": ".plan_bundle_entitlement_request_body",
"PlanBundleResponseData": ".plan_bundle_response_data",
+ "PlanCatalogMembershipResponseData": ".plan_catalog_membership_response_data",
"PlanChangeAction": ".plan_change_action",
"PlanChangeBasePlanAction": ".plan_change_base_plan_action",
"PlanChangeResponseData": ".plan_change_response_data",
@@ -698,6 +739,7 @@
"PreviewObject": ".preview_object",
"PreviewObjectResponseData": ".preview_object_response_data",
"PreviewSubscriptionChangeResponseData": ".preview_subscription_change_response_data",
+ "PreviewSubscriptionDiscountResponseData": ".preview_subscription_discount_response_data",
"PreviewSubscriptionFinanceResponseData": ".preview_subscription_finance_response_data",
"PreviewSubscriptionUpcomingInvoiceLineItems": ".preview_subscription_upcoming_invoice_line_items",
"ProrationBehavior": ".proration_behavior",
@@ -736,6 +778,7 @@
"RulesengineTraitDefinition": ".rulesengine_trait_definition",
"RulesengineTraitDefinitionComparableType": ".rulesengine_trait_definition_comparable_type",
"RulesengineUser": ".rulesengine_user",
+ "RulesengineWarningTier": ".rulesengine_warning_tier",
"ScheduledCheckoutResponseData": ".scheduled_checkout_response_data",
"ScheduledCheckoutStatus": ".scheduled_checkout_status",
"ScheduledDowngradeConfigBehavior": ".scheduled_downgrade_config_behavior",
@@ -778,6 +821,7 @@
"UsageTimeSeriesPointResponseData": ".usage_time_series_point_response_data",
"UserDetailResponseData": ".user_detail_response_data",
"UserResponseData": ".user_response_data",
+ "WarningTier": ".warning_tier",
"WarningTierRequestBody": ".warning_tier_request_body",
"WarningTierResponseData": ".warning_tier_response_data",
"WebFeatureUsageWebhookOutput": ".web_feature_usage_webhook_output",
@@ -827,6 +871,7 @@ def __dir__():
"ApiKeyIntegrationResponseData",
"ApiKeyResponseData",
"ApiKeyScope",
+ "AuditLogExportMetadata",
"AuditLogListResponseData",
"AuditLogResponseData",
"BillingCouponResponseData",
@@ -877,6 +922,18 @@ def __dir__():
"BillingTiersMode",
"CaptureRawEvent",
"CaptureRawEventBatch",
+ "CatalogConfigOrderedBundle",
+ "CatalogConfigOrderedBundleResponseData",
+ "CatalogConfigOrderedEntitlement",
+ "CatalogConfigOrderedEntitlementResponseData",
+ "CatalogConfigOrderedPlan",
+ "CatalogConfigOrderedPlanResponseData",
+ "CatalogConfigurationResponseData",
+ "CatalogCreditBundleIDsResponseData",
+ "CatalogDerivedFeatureResponseData",
+ "CatalogDerivedFeaturesResponseData",
+ "CatalogPlanIDsResponseData",
+ "CatalogResponseData",
"ChangeSubscriptionInternalRequestBody",
"ChangeSubscriptionRequestBody",
"ChargeType",
@@ -898,6 +955,7 @@ def __dir__():
"CompanyCreditBalanceResponseData",
"CompanyDetailResponseData",
"CompanyEventPeriodMetricsResponseData",
+ "CompanyFeatureUsageExportMetadata",
"CompanyLedgerResponseData",
"CompanyMatchingCriteria",
"CompanyMembershipDetailResponseData",
@@ -976,6 +1034,9 @@ def __dir__():
"CustomPlanConfig",
"CustomPlanViewConfigResponseData",
"DataEventPayload",
+ "DataExportMetadata",
+ "DataExportMetadata_AuditLog",
+ "DataExportMetadata_CompanyFeatureUsage",
"DataExportOutputFileType",
"DataExportResponseData",
"DataExportStatus",
@@ -1077,6 +1138,7 @@ def __dir__():
"PlanBundleCreditGrantRequestBody",
"PlanBundleEntitlementRequestBody",
"PlanBundleResponseData",
+ "PlanCatalogMembershipResponseData",
"PlanChangeAction",
"PlanChangeBasePlanAction",
"PlanChangeResponseData",
@@ -1114,6 +1176,7 @@ def __dir__():
"PreviewObject",
"PreviewObjectResponseData",
"PreviewSubscriptionChangeResponseData",
+ "PreviewSubscriptionDiscountResponseData",
"PreviewSubscriptionFinanceResponseData",
"PreviewSubscriptionUpcomingInvoiceLineItems",
"ProrationBehavior",
@@ -1152,6 +1215,7 @@ def __dir__():
"RulesengineTraitDefinition",
"RulesengineTraitDefinitionComparableType",
"RulesengineUser",
+ "RulesengineWarningTier",
"ScheduledCheckoutResponseData",
"ScheduledCheckoutStatus",
"ScheduledDowngradeConfigBehavior",
@@ -1194,6 +1258,7 @@ def __dir__():
"UsageTimeSeriesPointResponseData",
"UserDetailResponseData",
"UserResponseData",
+ "WarningTier",
"WarningTierRequestBody",
"WarningTierResponseData",
"WebFeatureUsageWebhookOutput",
diff --git a/src/schematic/types/audit_log_export_metadata.py b/src/schematic/types/audit_log_export_metadata.py
new file mode 100644
index 0000000..7e87b59
--- /dev/null
+++ b/src/schematic/types/audit_log_export_metadata.py
@@ -0,0 +1,43 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class AuditLogExportMetadata(UniversalBaseModel):
+ actor_type: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Restrict the export to audit log entries from this actor type
+ """
+
+ end_time: typing.Optional[dt.datetime] = pydantic.Field(default=None)
+ """
+ Restrict the export to audit log entries that started before this time
+ """
+
+ notification_email_recipient_email_addresses: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Account member emails to notify when the export completes; empty means the artifact is only retrievable via the API
+ """
+
+ q: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Free-text search over audit log entries
+ """
+
+ start_time: typing.Optional[dt.datetime] = pydantic.Field(default=None)
+ """
+ Restrict the export to audit log entries that started at or after this time
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_config_ordered_bundle.py b/src/schematic/types/catalog_config_ordered_bundle.py
new file mode 100644
index 0000000..a622f96
--- /dev/null
+++ b/src/schematic/types/catalog_config_ordered_bundle.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogConfigOrderedBundle(UniversalBaseModel):
+ bundle_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_config_ordered_bundle_response_data.py b/src/schematic/types/catalog_config_ordered_bundle_response_data.py
new file mode 100644
index 0000000..0d6e682
--- /dev/null
+++ b/src/schematic/types/catalog_config_ordered_bundle_response_data.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogConfigOrderedBundleResponseData(UniversalBaseModel):
+ bundle_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_config_ordered_entitlement.py b/src/schematic/types/catalog_config_ordered_entitlement.py
new file mode 100644
index 0000000..13e3f78
--- /dev/null
+++ b/src/schematic/types/catalog_config_ordered_entitlement.py
@@ -0,0 +1,20 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogConfigOrderedEntitlement(UniversalBaseModel):
+ plan_entitlement_id: str
+ visible: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_config_ordered_entitlement_response_data.py b/src/schematic/types/catalog_config_ordered_entitlement_response_data.py
new file mode 100644
index 0000000..f1e73d3
--- /dev/null
+++ b/src/schematic/types/catalog_config_ordered_entitlement_response_data.py
@@ -0,0 +1,20 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogConfigOrderedEntitlementResponseData(UniversalBaseModel):
+ plan_entitlement_id: str
+ visible: bool
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_config_ordered_plan.py b/src/schematic/types/catalog_config_ordered_plan.py
new file mode 100644
index 0000000..72e78bb
--- /dev/null
+++ b/src/schematic/types/catalog_config_ordered_plan.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .catalog_config_ordered_entitlement import CatalogConfigOrderedEntitlement
+
+
+class CatalogConfigOrderedPlan(UniversalBaseModel):
+ entitlements: typing.Optional[typing.List[CatalogConfigOrderedEntitlement]] = None
+ plan_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_config_ordered_plan_response_data.py b/src/schematic/types/catalog_config_ordered_plan_response_data.py
new file mode 100644
index 0000000..86c16e9
--- /dev/null
+++ b/src/schematic/types/catalog_config_ordered_plan_response_data.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .catalog_config_ordered_entitlement_response_data import CatalogConfigOrderedEntitlementResponseData
+
+
+class CatalogConfigOrderedPlanResponseData(UniversalBaseModel):
+ entitlements: typing.List[CatalogConfigOrderedEntitlementResponseData]
+ plan_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_configuration_response_data.py b/src/schematic/types/catalog_configuration_response_data.py
new file mode 100644
index 0000000..d173395
--- /dev/null
+++ b/src/schematic/types/catalog_configuration_response_data.py
@@ -0,0 +1,32 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .catalog_config_ordered_bundle_response_data import CatalogConfigOrderedBundleResponseData
+from .catalog_config_ordered_plan_response_data import CatalogConfigOrderedPlanResponseData
+from .plan_group_plan_detail_response_data import PlanGroupPlanDetailResponseData
+
+
+class CatalogConfigurationResponseData(UniversalBaseModel):
+ add_ons: typing.List[PlanGroupPlanDetailResponseData]
+ custom_plan_cta_text: typing.Optional[str] = None
+ custom_plan_cta_url: typing.Optional[str] = None
+ custom_plan_price_text: typing.Optional[str] = None
+ custom_plans_visible: bool
+ ordered_add_ons: typing.List[CatalogConfigOrderedPlanResponseData]
+ ordered_bundles: typing.List[CatalogConfigOrderedBundleResponseData]
+ ordered_plans: typing.List[CatalogConfigOrderedPlanResponseData]
+ plans: typing.List[PlanGroupPlanDetailResponseData]
+ pricing_model: typing.Optional[str] = None
+ pricing_url: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_credit_bundle_i_ds_response_data.py b/src/schematic/types/catalog_credit_bundle_i_ds_response_data.py
new file mode 100644
index 0000000..675685a
--- /dev/null
+++ b/src/schematic/types/catalog_credit_bundle_i_ds_response_data.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogCreditBundleIDsResponseData(UniversalBaseModel):
+ credit_bundle_ids: typing.List[str]
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_derived_feature_response_data.py b/src/schematic/types/catalog_derived_feature_response_data.py
new file mode 100644
index 0000000..8295913
--- /dev/null
+++ b/src/schematic/types/catalog_derived_feature_response_data.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogDerivedFeatureResponseData(UniversalBaseModel):
+ icon: str
+ id: str
+ name: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_derived_features_response_data.py b/src/schematic/types/catalog_derived_features_response_data.py
new file mode 100644
index 0000000..cdf7357
--- /dev/null
+++ b/src/schematic/types/catalog_derived_features_response_data.py
@@ -0,0 +1,20 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .catalog_derived_feature_response_data import CatalogDerivedFeatureResponseData
+
+
+class CatalogDerivedFeaturesResponseData(UniversalBaseModel):
+ features: typing.List[CatalogDerivedFeatureResponseData]
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_plan_i_ds_response_data.py b/src/schematic/types/catalog_plan_i_ds_response_data.py
new file mode 100644
index 0000000..093668c
--- /dev/null
+++ b/src/schematic/types/catalog_plan_i_ds_response_data.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogPlanIDsResponseData(UniversalBaseModel):
+ plan_ids: typing.List[str]
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/catalog_response_data.py b/src/schematic/types/catalog_response_data.py
new file mode 100644
index 0000000..36d0692
--- /dev/null
+++ b/src/schematic/types/catalog_response_data.py
@@ -0,0 +1,33 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CatalogResponseData(UniversalBaseModel):
+ account_id: str
+ created_at: dt.datetime
+ custom_plan_cta_text: typing.Optional[str] = None
+ custom_plan_cta_url: typing.Optional[str] = None
+ custom_plan_price_text: typing.Optional[str] = None
+ custom_plans_visible: bool
+ description: typing.Optional[str] = None
+ environment_id: str
+ id: str
+ is_default: bool
+ name: str
+ pricing_model: typing.Optional[str] = None
+ pricing_url: typing.Optional[str] = None
+ updated_at: dt.datetime
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/company_feature_usage_export_metadata.py b/src/schematic/types/company_feature_usage_export_metadata.py
new file mode 100644
index 0000000..1b2cb8c
--- /dev/null
+++ b/src/schematic/types/company_feature_usage_export_metadata.py
@@ -0,0 +1,102 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class CompanyFeatureUsageExportMetadata(UniversalBaseModel):
+ company_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Restrict the export to these Schematic company IDs (starting with 'comp_')
+ """
+
+ credit_type_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies with these billing credit type IDs
+ """
+
+ feature_ids: typing.List[str] = pydantic.Field()
+ """
+ Schematic feature IDs (starting with 'feat_') to include as usage columns; at least one is required
+ """
+
+ has_scheduled_downgrade: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies that do (or do not) have a scheduled downgrade
+ """
+
+ monetized_subscriptions: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies with (or without) a monetized subscription
+ """
+
+ notification_email_recipient_email_addresses: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Account member emails to notify when the export completes; empty means the artifact is only retrievable via the API
+ """
+
+ plan_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies on this plan ID (starting with 'plan_')
+ """
+
+ plan_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies on any of these plan IDs
+ """
+
+ plan_version_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies on this plan version ID
+ """
+
+ q: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Free-text search over company name and keys
+ """
+
+ subscription_statuses: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies whose subscription has one of these statuses
+ """
+
+ subscription_types: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies whose subscription has one of these types
+ """
+
+ with_entitlement_for: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies that have an entitlement for this feature ID
+ """
+
+ with_subscription: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies with a subscription
+ """
+
+ without_feature_override_for: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies without a company-level override for this feature ID
+ """
+
+ without_plan: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies without a plan
+ """
+
+ without_subscription: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Restrict the export to companies without a subscription
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/company_plan_detail_response_data.py b/src/schematic/types/company_plan_detail_response_data.py
index 7796e6c..1171169 100644
--- a/src/schematic/types/company_plan_detail_response_data.py
+++ b/src/schematic/types/company_plan_detail_response_data.py
@@ -16,6 +16,7 @@
from .custom_plan_config import CustomPlanConfig
from .feature_in_plan_response_data import FeatureInPlanResponseData
from .feature_usage_response_data import FeatureUsageResponseData
+from .plan_catalog_membership_response_data import PlanCatalogMembershipResponseData
from .plan_credit_grant_view import PlanCreditGrantView
from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData
from .plan_entitlement_response_data import PlanEntitlementResponseData
@@ -32,6 +33,7 @@ class CompanyPlanDetailResponseData(UniversalBaseModel):
billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None
billing_product: typing.Optional[BillingProductDetailResponseData] = None
billing_strategy: BillingStrategy
+ catalogs: typing.Optional[typing.List[PlanCatalogMembershipResponseData]] = None
charge_type: ChargeType
company_can_trial: bool
company_count: int
diff --git a/src/schematic/types/component_response_data.py b/src/schematic/types/component_response_data.py
index deddd0b..e10ce08 100644
--- a/src/schematic/types/component_response_data.py
+++ b/src/schematic/types/component_response_data.py
@@ -11,6 +11,7 @@
class ComponentResponseData(UniversalBaseModel):
ast: typing.Optional[typing.Dict[str, float]] = None
+ catalog_id: typing.Optional[str] = None
created_at: dt.datetime
id: str
name: str
diff --git a/src/schematic/types/data_export_metadata.py b/src/schematic/types/data_export_metadata.py
new file mode 100644
index 0000000..8e9d68f
--- /dev/null
+++ b/src/schematic/types/data_export_metadata.py
@@ -0,0 +1,64 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from __future__ import annotations
+
+import datetime as dt
+import typing
+
+import pydantic
+import typing_extensions
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class DataExportMetadata_AuditLog(UniversalBaseModel):
+ export_type: typing.Literal["audit-log"] = "audit-log"
+ actor_type: typing.Optional[str] = None
+ end_time: typing.Optional[dt.datetime] = None
+ notification_email_recipient_email_addresses: typing.Optional[typing.List[str]] = None
+ q: typing.Optional[str] = None
+ start_time: typing.Optional[dt.datetime] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
+
+
+class DataExportMetadata_CompanyFeatureUsage(UniversalBaseModel):
+ export_type: typing.Literal["company-feature-usage"] = "company-feature-usage"
+ company_ids: typing.Optional[typing.List[str]] = None
+ credit_type_ids: typing.Optional[typing.List[str]] = None
+ feature_ids: typing.List[str]
+ has_scheduled_downgrade: typing.Optional[bool] = None
+ monetized_subscriptions: typing.Optional[bool] = None
+ notification_email_recipient_email_addresses: typing.Optional[typing.List[str]] = None
+ plan_id: typing.Optional[str] = None
+ plan_ids: typing.Optional[typing.List[str]] = None
+ plan_version_id: typing.Optional[str] = None
+ q: typing.Optional[str] = None
+ subscription_statuses: typing.Optional[typing.List[str]] = None
+ subscription_types: typing.Optional[typing.List[str]] = None
+ with_entitlement_for: typing.Optional[str] = None
+ with_subscription: typing.Optional[bool] = None
+ without_feature_override_for: typing.Optional[str] = None
+ without_plan: typing.Optional[bool] = None
+ without_subscription: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
+
+
+DataExportMetadata = typing_extensions.Annotated[
+ typing.Union[DataExportMetadata_AuditLog, DataExportMetadata_CompanyFeatureUsage],
+ pydantic.Field(discriminator="export_type"),
+]
diff --git a/src/schematic/types/data_export_output_file_type.py b/src/schematic/types/data_export_output_file_type.py
index b1fa266..273e87e 100644
--- a/src/schematic/types/data_export_output_file_type.py
+++ b/src/schematic/types/data_export_output_file_type.py
@@ -2,4 +2,4 @@
import typing
-DataExportOutputFileType = typing.Literal["csv"]
+DataExportOutputFileType = typing.Union[typing.Literal["csv", "csv.gz"], typing.Any]
diff --git a/src/schematic/types/data_export_response_data.py b/src/schematic/types/data_export_response_data.py
index 9974bd1..22e367b 100644
--- a/src/schematic/types/data_export_response_data.py
+++ b/src/schematic/types/data_export_response_data.py
@@ -5,6 +5,7 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .data_export_metadata import DataExportMetadata
from .data_export_output_file_type import DataExportOutputFileType
from .data_export_status import DataExportStatus
from .data_export_type import DataExportType
@@ -14,10 +15,10 @@ class DataExportResponseData(UniversalBaseModel):
account_id: str
created_at: dt.datetime
environment_id: str
- export_type: DataExportType = "company-feature-usage"
+ export_type: DataExportType
id: str
- metadata: str
- output_file_type: DataExportOutputFileType = "csv"
+ metadata: typing.Optional[DataExportMetadata] = None
+ output_file_type: DataExportOutputFileType
status: DataExportStatus
updated_at: dt.datetime
diff --git a/src/schematic/types/data_export_type.py b/src/schematic/types/data_export_type.py
index 0a2408a..6c073cc 100644
--- a/src/schematic/types/data_export_type.py
+++ b/src/schematic/types/data_export_type.py
@@ -2,4 +2,4 @@
import typing
-DataExportType = typing.Literal["company-feature-usage"]
+DataExportType = typing.Union[typing.Literal["audit-log", "company-feature-usage"], typing.Any]
diff --git a/src/schematic/types/feature_entitlement.py b/src/schematic/types/feature_entitlement.py
index 5b076e7..85351c9 100644
--- a/src/schematic/types/feature_entitlement.py
+++ b/src/schematic/types/feature_entitlement.py
@@ -8,6 +8,7 @@
from .entitlement_value_type import EntitlementValueType
from .metric_period import MetricPeriod
from .metric_period_month_reset import MetricPeriodMonthReset
+from .warning_tier import WarningTier
class FeatureEntitlement(UniversalBaseModel):
@@ -101,6 +102,11 @@ class FeatureEntitlement(UniversalBaseModel):
The type of the entitlement value
"""
+ warning_tiers: typing.Optional[typing.List[WarningTier]] = pydantic.Field(default=None)
+ """
+ Customer-defined usage warning thresholds configured on this entitlement
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/schematic/types/plan_catalog_membership_response_data.py b/src/schematic/types/plan_catalog_membership_response_data.py
new file mode 100644
index 0000000..2efb198
--- /dev/null
+++ b/src/schematic/types/plan_catalog_membership_response_data.py
@@ -0,0 +1,20 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class PlanCatalogMembershipResponseData(UniversalBaseModel):
+ id: str
+ name: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/plan_detail_response_data.py b/src/schematic/types/plan_detail_response_data.py
index 38b58e7..4bc1bb5 100644
--- a/src/schematic/types/plan_detail_response_data.py
+++ b/src/schematic/types/plan_detail_response_data.py
@@ -14,6 +14,7 @@
from .billing_strategy import BillingStrategy
from .charge_type import ChargeType
from .feature_in_plan_response_data import FeatureInPlanResponseData
+from .plan_catalog_membership_response_data import PlanCatalogMembershipResponseData
from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData
from .plan_entitlement_response_data import PlanEntitlementResponseData
from .plan_icon import PlanIcon
@@ -27,6 +28,7 @@ class PlanDetailResponseData(UniversalBaseModel):
billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None
billing_product: typing.Optional[BillingProductDetailResponseData] = None
billing_strategy: BillingStrategy
+ catalogs: typing.Optional[typing.List[PlanCatalogMembershipResponseData]] = None
charge_type: ChargeType
company_count: int
company_id: typing.Optional[str] = None
diff --git a/src/schematic/types/plan_group_plan_detail_response_data.py b/src/schematic/types/plan_group_plan_detail_response_data.py
index 3f78c5c..8aefcc3 100644
--- a/src/schematic/types/plan_group_plan_detail_response_data.py
+++ b/src/schematic/types/plan_group_plan_detail_response_data.py
@@ -15,6 +15,7 @@
from .charge_type import ChargeType
from .custom_plan_view_config_response_data import CustomPlanViewConfigResponseData
from .feature_in_plan_response_data import FeatureInPlanResponseData
+from .plan_catalog_membership_response_data import PlanCatalogMembershipResponseData
from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData
from .plan_entitlement_response_data import PlanEntitlementResponseData
from .plan_icon import PlanIcon
@@ -30,6 +31,7 @@ class PlanGroupPlanDetailResponseData(UniversalBaseModel):
billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None
billing_product: typing.Optional[BillingProductDetailResponseData] = None
billing_strategy: BillingStrategy
+ catalogs: typing.Optional[typing.List[PlanCatalogMembershipResponseData]] = None
charge_type: ChargeType
company_count: int
company_id: typing.Optional[str] = None
diff --git a/src/schematic/types/plan_view_public_response_data.py b/src/schematic/types/plan_view_public_response_data.py
index d7d952f..31deaf8 100644
--- a/src/schematic/types/plan_view_public_response_data.py
+++ b/src/schematic/types/plan_view_public_response_data.py
@@ -14,6 +14,7 @@
from .charge_type import ChargeType
from .custom_plan_config import CustomPlanConfig
from .feature_in_plan_response_data import FeatureInPlanResponseData
+from .plan_catalog_membership_response_data import PlanCatalogMembershipResponseData
from .plan_credit_grant_view import PlanCreditGrantView
from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData
from .plan_entitlement_response_data import PlanEntitlementResponseData
@@ -30,6 +31,7 @@ class PlanViewPublicResponseData(UniversalBaseModel):
billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None
billing_product: typing.Optional[BillingProductDetailResponseData] = None
billing_strategy: BillingStrategy
+ catalogs: typing.Optional[typing.List[PlanCatalogMembershipResponseData]] = None
charge_type: ChargeType
company_count: int
company_id: typing.Optional[str] = None
diff --git a/src/schematic/types/preview_subscription_discount_response_data.py b/src/schematic/types/preview_subscription_discount_response_data.py
new file mode 100644
index 0000000..8d426ce
--- /dev/null
+++ b/src/schematic/types/preview_subscription_discount_response_data.py
@@ -0,0 +1,30 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class PreviewSubscriptionDiscountResponseData(UniversalBaseModel):
+ amount_off: typing.Optional[int] = None
+ coupon_name: str
+ currency: typing.Optional[str] = None
+ customer_facing_code: typing.Optional[str] = None
+ duration: str
+ duration_in_months: typing.Optional[int] = None
+ ended_at: typing.Optional[dt.datetime] = None
+ is_active: bool
+ percent_off: typing.Optional[float] = None
+ promo_code_external_id: typing.Optional[str] = None
+ started_at: dt.datetime
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/preview_subscription_finance_response_data.py b/src/schematic/types/preview_subscription_finance_response_data.py
index 9f6fc15..ceaa47d 100644
--- a/src/schematic/types/preview_subscription_finance_response_data.py
+++ b/src/schematic/types/preview_subscription_finance_response_data.py
@@ -5,14 +5,17 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .preview_subscription_discount_response_data import PreviewSubscriptionDiscountResponseData
from .preview_subscription_upcoming_invoice_line_items import PreviewSubscriptionUpcomingInvoiceLineItems
class PreviewSubscriptionFinanceResponseData(UniversalBaseModel):
amount_off: int
+ discounts: typing.List[PreviewSubscriptionDiscountResponseData]
due_now: int
new_charges: int
percent_off: float
+ period_end: dt.datetime
period_start: dt.datetime
promo_code_applied: bool
proration: int
diff --git a/src/schematic/types/rulesengine_feature_entitlement.py b/src/schematic/types/rulesengine_feature_entitlement.py
index f236814..4926352 100644
--- a/src/schematic/types/rulesengine_feature_entitlement.py
+++ b/src/schematic/types/rulesengine_feature_entitlement.py
@@ -8,6 +8,7 @@
from .rulesengine_entitlement_value_type import RulesengineEntitlementValueType
from .rulesengine_metric_period import RulesengineMetricPeriod
from .rulesengine_metric_period_month_reset import RulesengineMetricPeriodMonthReset
+from .rulesengine_warning_tier import RulesengineWarningTier
class RulesengineFeatureEntitlement(UniversalBaseModel):
@@ -101,6 +102,11 @@ class RulesengineFeatureEntitlement(UniversalBaseModel):
The type of the entitlement value
"""
+ warning_tiers: typing.Optional[typing.List[RulesengineWarningTier]] = pydantic.Field(default=None)
+ """
+ Customer-defined usage warning thresholds configured on this entitlement
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/schematic/types/rulesengine_warning_tier.py b/src/schematic/types/rulesengine_warning_tier.py
new file mode 100644
index 0000000..585a4e2
--- /dev/null
+++ b/src/schematic/types/rulesengine_warning_tier.py
@@ -0,0 +1,27 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class RulesengineWarningTier(UniversalBaseModel):
+ key: str = pydantic.Field()
+ """
+ A customer-defined identifier for the warning tier
+ """
+
+ value: int = pydantic.Field()
+ """
+ The warning threshold, in the entitlement's usage units
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/schematic/types/upsert_company_request_body.py b/src/schematic/types/upsert_company_request_body.py
index 4bd62aa..ba8ada6 100644
--- a/src/schematic/types/upsert_company_request_body.py
+++ b/src/schematic/types/upsert_company_request_body.py
@@ -8,6 +8,16 @@
class UpsertCompanyRequestBody(UniversalBaseModel):
+ base_plan_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Assign this base plan when creating the company (starts with plan_). Takes precedence over the environment's initial plan and must be provisionable without a payment method.
+ """
+
+ base_plan_price_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The Schematic price to provision for base_plan_id (starts with bilpp_). Required and must be $0 for a billing-linked plan; omit for a plan that is not billing-linked.
+ """
+
id: typing.Optional[str] = pydantic.Field(default=None)
"""
If you know the Schematic ID, you can use that here instead of keys
diff --git a/src/schematic/types/warning_tier.py b/src/schematic/types/warning_tier.py
new file mode 100644
index 0000000..ae59ee4
--- /dev/null
+++ b/src/schematic/types/warning_tier.py
@@ -0,0 +1,27 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class WarningTier(UniversalBaseModel):
+ key: str = pydantic.Field()
+ """
+ A customer-defined identifier for the warning tier
+ """
+
+ value: int = pydantic.Field()
+ """
+ The warning threshold, in the entitlement's usage units
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow