diff --git a/.fern/metadata.json b/.fern/metadata.json index 2e534d4..ab43faf 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -1,7 +1,7 @@ { - "cliVersion": "3.10.0", + "cliVersion": "3.54.1", "generatorName": "fernapi/fern-python-sdk", - "generatorVersion": "4.45.3", + "generatorVersion": "4.54.2", "generatorConfig": { "package_name": "truefoundry_sdk", "pydantic_config": { @@ -21,5 +21,6 @@ "Jinja2": ">=3.1.6,<4.0.0", "numpydoc": ">=1.7.0,<2.0.0" } - } + }, + "sdkVersion": "0.0.0" } \ No newline at end of file diff --git a/README.md b/README.md index fa29765..47831b9 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ client = TrueFoundry( ) response = client.applications.with_raw_response.list(...) print(response.headers) # access the response headers +print(response.status_code) # access the response status code print(response.data) # access the underlying object pager = client.users.list(...) print(pager.response) # access the typed response for the first page diff --git a/poetry.lock b/poetry.lock index 7bde5c8..bc5c4e1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -103,13 +103,13 @@ files = [ [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.1.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" files = [ - {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, - {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, ] [[package]] @@ -672,13 +672,13 @@ test = ["matplotlib", "pytest", "pytest-cov"] [[package]] name = "packaging" -version = "25.0" +version = "26.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, ] [[package]] @@ -1246,53 +1246,58 @@ widechars = ["wcwidth"] [[package]] name = "tomli" -version = "2.3.0" +version = "2.4.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, - {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, - {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, - {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, - {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, - {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, - {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, - {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, - {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, - {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, - {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, - {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, - {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, - {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, + {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, + {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, + {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, + {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, + {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, + {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, + {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, + {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, + {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, ] [[package]] @@ -1351,13 +1356,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.5.2" description = "Measures the displayed width of unicode strings in a terminal" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1"}, - {file = "wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605"}, + {file = "wcwidth-0.5.2-py3-none-any.whl", hash = "sha256:46912178a64217749bf3426b21e36e849fbc46e05c949407b3e364d9f7ffcadf"}, + {file = "wcwidth-0.5.2.tar.gz", hash = "sha256:c022c39a02a0134d1e10810da36d1f984c79648181efcc70a389f4569695f5ae"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index e8936f1..299affc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,9 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Operating System :: POSIX", "Operating System :: MacOS", diff --git a/reference.md b/reference.md index 9c74a3a..f7ccc8b 100644 --- a/reference.md +++ b/reference.md @@ -1,5 +1,5 @@ # Reference -
client.apply(...) -> AsyncHttpResponse[TrueFoundryApplyResponse] +
client.apply(...) -> AsyncHttpResponse[TrueFoundryApplyResponse]
@@ -87,7 +87,7 @@ client.apply(
-
client.delete(...) -> AsyncHttpResponse[None] +
client.delete(...) -> AsyncHttpResponse[None]
@@ -168,7 +168,7 @@ client.delete(
## Internal -
client.internal.get_id_from_fqn(...) -> AsyncHttpResponse[typing.Dict[str, typing.Any]] +
client.internal.get_id_from_fqn(...) -> AsyncHttpResponse[typing.Dict[str, typing.Any]]
@@ -249,7 +249,7 @@ client.internal.get_id_from_fqn(
## Users -
client.users.list(...) -> AsyncPager[User, ListUsersResponse] +
client.users.list(...) -> AsyncPager[User, ListUsersResponse]
@@ -361,7 +361,7 @@ for page in response.iter_pages():
-
client.users.pre_register_users(...) -> AsyncHttpResponse[RegisterUsersResponse] +
client.users.pre_register_users(...) -> AsyncHttpResponse[RegisterUsersResponse]
@@ -464,7 +464,7 @@ client.users.pre_register_users(
-
client.users.update_roles(...) -> AsyncHttpResponse[UpdateUserRolesResponse] +
client.users.update_roles(...) -> AsyncHttpResponse[UpdateUserRolesResponse]
@@ -552,7 +552,7 @@ client.users.update_roles(
-
client.users.get(...) -> AsyncHttpResponse[GetUserResponse] +
client.users.get(...) -> AsyncHttpResponse[GetUserResponse]
@@ -623,7 +623,7 @@ client.users.get(
-
client.users.delete(...) -> AsyncHttpResponse[DeleteUserResponse] +
client.users.delete(...) -> AsyncHttpResponse[DeleteUserResponse]
@@ -694,7 +694,7 @@ client.users.delete(
-
client.users.invite_user(...) -> AsyncHttpResponse[InviteUserResponse] +
client.users.invite_user(...) -> AsyncHttpResponse[InviteUserResponse]
@@ -774,7 +774,7 @@ client.users.invite_user(
-
client.users.deactivate(...) -> AsyncHttpResponse[DeactivateUserResponse] +
client.users.deactivate(...) -> AsyncHttpResponse[DeactivateUserResponse]
@@ -845,7 +845,7 @@ client.users.deactivate(
-
client.users.activate(...) -> AsyncHttpResponse[ActivateUserResponse] +
client.users.activate(...) -> AsyncHttpResponse[ActivateUserResponse]
@@ -916,7 +916,7 @@ client.users.activate(
-
client.users.change_password(...) -> AsyncHttpResponse[ChangePasswordResponse] +
client.users.change_password(...) -> AsyncHttpResponse[ChangePasswordResponse]
@@ -1005,7 +1005,7 @@ client.users.change_password(
-
client.users.get_resources(...) -> AsyncHttpResponse[GetUserResourcesResponse] +
client.users.get_resources(...) -> AsyncHttpResponse[GetUserResourcesResponse]
@@ -1076,7 +1076,7 @@ client.users.get_resources(
-
client.users.get_teams(...) -> AsyncHttpResponse[GetUserTeamsResponse] +
client.users.get_teams(...) -> AsyncHttpResponse[GetUserTeamsResponse]
@@ -1148,7 +1148,7 @@ client.users.get_teams(
## Teams -
client.teams.list(...) -> AsyncPager[Team, ListTeamsResponse] +
client.teams.list(...) -> AsyncPager[Team, ListTeamsResponse]
@@ -1243,7 +1243,7 @@ for page in response.iter_pages():
-
client.teams.create_or_update(...) -> AsyncHttpResponse[GetTeamResponse] +
client.teams.create_or_update(...) -> AsyncHttpResponse[GetTeamResponse]
@@ -1325,7 +1325,7 @@ client.teams.create_or_update(
-
client.teams.get(...) -> AsyncHttpResponse[GetTeamResponse] +
client.teams.get(...) -> AsyncHttpResponse[GetTeamResponse]
@@ -1396,7 +1396,7 @@ client.teams.get(
-
client.teams.delete(...) -> AsyncHttpResponse[DeleteTeamResponse] +
client.teams.delete(...) -> AsyncHttpResponse[DeleteTeamResponse]
@@ -1468,7 +1468,7 @@ client.teams.delete(
## PersonalAccessTokens -
client.personal_access_tokens.list(...) -> AsyncPager[VirtualAccount, ListPersonalAccessTokenResponse] +
client.personal_access_tokens.list(...) -> AsyncPager[VirtualAccount, ListPersonalAccessTokenResponse]
@@ -1553,7 +1553,7 @@ for page in response.iter_pages():
-
client.personal_access_tokens.create(...) -> AsyncHttpResponse[CreatePersonalAccessTokenResponse] +
client.personal_access_tokens.create(...) -> AsyncHttpResponse[CreatePersonalAccessTokenResponse]
@@ -1640,7 +1640,7 @@ client.personal_access_tokens.create(
-
client.personal_access_tokens.revoke_all(...) -> AsyncHttpResponse[RevokeAllPersonalAccessTokenResponse] +
client.personal_access_tokens.revoke_all(...) -> AsyncHttpResponse[RevokeAllPersonalAccessTokenResponse]
@@ -1711,7 +1711,7 @@ client.personal_access_tokens.revoke_all(
-
client.personal_access_tokens.delete(...) -> AsyncHttpResponse[DeletePersonalAccessTokenResponse] +
client.personal_access_tokens.delete(...) -> AsyncHttpResponse[DeletePersonalAccessTokenResponse]
@@ -1782,7 +1782,7 @@ client.personal_access_tokens.delete(
-
client.personal_access_tokens.get(...) -> AsyncHttpResponse[GetOrCreatePersonalAccessTokenResponse] +
client.personal_access_tokens.get(...) -> AsyncHttpResponse[GetOrCreatePersonalAccessTokenResponse]
@@ -1854,7 +1854,7 @@ client.personal_access_tokens.get(
## VirtualAccounts -
client.virtual_accounts.list(...) -> AsyncPager[VirtualAccount, ListVirtualAccountResponse] +
client.virtual_accounts.list(...) -> AsyncPager[VirtualAccount, ListVirtualAccountResponse]
@@ -1939,7 +1939,7 @@ for page in response.iter_pages():
-
client.virtual_accounts.create_or_update(...) -> AsyncHttpResponse[GetVirtualAccountResponse] +
client.virtual_accounts.create_or_update(...) -> AsyncHttpResponse[GetVirtualAccountResponse]
@@ -2027,7 +2027,7 @@ client.virtual_accounts.create_or_update(
-
client.virtual_accounts.get(...) -> AsyncHttpResponse[GetVirtualAccountResponse] +
client.virtual_accounts.get(...) -> AsyncHttpResponse[GetVirtualAccountResponse]
@@ -2098,7 +2098,7 @@ client.virtual_accounts.get(
-
client.virtual_accounts.delete(...) -> AsyncHttpResponse[DeleteVirtualAccountResponse] +
client.virtual_accounts.delete(...) -> AsyncHttpResponse[DeleteVirtualAccountResponse]
@@ -2169,7 +2169,7 @@ client.virtual_accounts.delete(
-
client.virtual_accounts.get_token(...) -> AsyncHttpResponse[GetTokenForVirtualAccountResponse] +
client.virtual_accounts.get_token(...) -> AsyncHttpResponse[GetTokenForVirtualAccountResponse]
@@ -2240,7 +2240,7 @@ client.virtual_accounts.get_token(
-
client.virtual_accounts.sync_to_secret_store(...) -> AsyncHttpResponse[SyncVirtualAccountTokenResponse] +
client.virtual_accounts.sync_to_secret_store(...) -> AsyncHttpResponse[SyncVirtualAccountTokenResponse]
@@ -2311,7 +2311,7 @@ client.virtual_accounts.sync_to_secret_store(
-
client.virtual_accounts.regenerate_token(...) -> AsyncHttpResponse[GetTokenForVirtualAccountResponse] +
client.virtual_accounts.regenerate_token(...) -> AsyncHttpResponse[GetTokenForVirtualAccountResponse]
@@ -2391,7 +2391,7 @@ client.virtual_accounts.regenerate_token(
-
client.virtual_accounts.delete_jwt(...) -> AsyncHttpResponse[None] +
client.virtual_accounts.delete_jwt(...) -> AsyncHttpResponse[None]
@@ -2472,7 +2472,7 @@ client.virtual_accounts.delete_jwt(
## Clusters -
client.clusters.list(...) -> AsyncPager[Cluster, ListClustersResponse] +
client.clusters.list(...) -> AsyncPager[Cluster, ListClustersResponse]
@@ -2557,7 +2557,7 @@ for page in response.iter_pages():
-
client.clusters.create_or_update(...) -> AsyncHttpResponse[GetClusterResponse] +
client.clusters.create_or_update(...) -> AsyncHttpResponse[GetClusterResponse]
@@ -2651,7 +2651,7 @@ client.clusters.create_or_update(
-
client.clusters.get(...) -> AsyncHttpResponse[GetClusterResponse] +
client.clusters.get(...) -> AsyncHttpResponse[GetClusterResponse]
@@ -2722,7 +2722,7 @@ client.clusters.get(
-
client.clusters.delete(...) -> AsyncHttpResponse[ClustersDeleteResponse] +
client.clusters.delete(...) -> AsyncHttpResponse[ClustersDeleteResponse]
@@ -2793,7 +2793,7 @@ client.clusters.delete(
-
client.clusters.get_addons(...) -> AsyncHttpResponse[ListClusterAddonsResponse] +
client.clusters.get_addons(...) -> AsyncHttpResponse[ListClusterAddonsResponse]
@@ -2882,7 +2882,7 @@ client.clusters.get_addons(
-
client.clusters.is_connected(...) -> AsyncHttpResponse[IsClusterConnectedResponse] +
client.clusters.is_connected(...) -> AsyncHttpResponse[IsClusterConnectedResponse]
@@ -2954,7 +2954,7 @@ client.clusters.is_connected(
## Applications -
client.applications.list(...) -> AsyncPager[Application, ListApplicationsResponse] +
client.applications.list(...) -> AsyncPager[Application, ListApplicationsResponse]
@@ -3178,7 +3178,7 @@ for page in response.iter_pages():
-
client.applications.create_or_update(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse] +
client.applications.create_or_update(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse]
@@ -3305,7 +3305,7 @@ client.applications.create_or_update(
-
client.applications.get(...) -> AsyncHttpResponse[GetApplicationResponse] +
client.applications.get(...) -> AsyncHttpResponse[GetApplicationResponse]
@@ -3376,7 +3376,7 @@ client.applications.get(
-
client.applications.delete(...) -> AsyncHttpResponse[DeleteApplicationResponse] +
client.applications.delete(...) -> AsyncHttpResponse[DeleteApplicationResponse]
@@ -3447,7 +3447,7 @@ client.applications.delete(
-
client.applications.scale_to_zero(...) -> AsyncHttpResponse[None] +
client.applications.scale_to_zero(...) -> AsyncHttpResponse[None]
@@ -3518,7 +3518,7 @@ client.applications.scale_to_zero(
-
client.applications.scale_to_original(...) -> AsyncHttpResponse[Deployment] +
client.applications.scale_to_original(...) -> AsyncHttpResponse[Deployment]
@@ -3589,7 +3589,7 @@ client.applications.scale_to_original(
-
client.applications.cancel_deployment(...) -> AsyncHttpResponse[ApplicationsCancelDeploymentResponse] +
client.applications.cancel_deployment(...) -> AsyncHttpResponse[ApplicationsCancelDeploymentResponse]
@@ -3670,7 +3670,7 @@ client.applications.cancel_deployment(
## ApplicationVersions -
client.application_versions.list(...) -> AsyncPager[Deployment, ListApplicationDeploymentsResponse] +
client.application_versions.list(...) -> AsyncPager[Deployment, ListApplicationDeploymentsResponse]
@@ -3782,7 +3782,7 @@ for page in response.iter_pages():
-
client.application_versions.get(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse] +
client.application_versions.get(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse]
@@ -3863,7 +3863,7 @@ client.application_versions.get(
## Jobs -
client.jobs.list_runs(...) -> AsyncPager[JobRun, ListJobRunResponse] +
client.jobs.list_runs(...) -> AsyncPager[JobRun, ListJobRunResponse]
@@ -4008,7 +4008,7 @@ for page in response.iter_pages():
-
client.jobs.get_run(...) -> AsyncHttpResponse[GetJobRunResponse] +
client.jobs.get_run(...) -> AsyncHttpResponse[GetJobRunResponse]
@@ -4088,7 +4088,7 @@ client.jobs.get_run(
-
client.jobs.delete_run(...) -> AsyncHttpResponse[DeleteJobRunResponse] +
client.jobs.delete_run(...) -> AsyncHttpResponse[DeleteJobRunResponse]
@@ -4168,7 +4168,7 @@ client.jobs.delete_run(
-
client.jobs.trigger(...) -> AsyncHttpResponse[TriggerJobRunResponse] +
client.jobs.trigger(...) -> AsyncHttpResponse[TriggerJobRunResponse]
@@ -4261,7 +4261,7 @@ client.jobs.trigger()
-
client.jobs.terminate(...) -> AsyncHttpResponse[TerminateJobResponse] +
client.jobs.terminate(...) -> AsyncHttpResponse[TerminateJobResponse]
@@ -4342,7 +4342,7 @@ client.jobs.terminate(
## Workspaces -
client.workspaces.list(...) -> AsyncPager[Workspace, ListWorkspacesResponse] +
client.workspaces.list(...) -> AsyncPager[Workspace, ListWorkspacesResponse]
@@ -4454,7 +4454,7 @@ for page in response.iter_pages():
-
client.workspaces.create_or_update(...) -> AsyncHttpResponse[GetWorkspaceResponse] +
client.workspaces.create_or_update(...) -> AsyncHttpResponse[GetWorkspaceResponse]
@@ -4536,7 +4536,7 @@ client.workspaces.create_or_update(
-
client.workspaces.get(...) -> AsyncHttpResponse[GetWorkspaceResponse] +
client.workspaces.get(...) -> AsyncHttpResponse[GetWorkspaceResponse]
@@ -4607,7 +4607,7 @@ client.workspaces.get(
-
client.workspaces.delete(...) -> AsyncHttpResponse[WorkspacesDeleteResponse] +
client.workspaces.delete(...) -> AsyncHttpResponse[WorkspacesDeleteResponse]
@@ -4681,7 +4681,7 @@ client.workspaces.delete(
## Environments -
client.environments.list(...) -> AsyncPager[Environment, ListEnvironmentsResponse] +
client.environments.list(...) -> AsyncPager[Environment, ListEnvironmentsResponse]
@@ -4766,7 +4766,7 @@ for page in response.iter_pages():
-
client.environments.create_or_update(...) -> AsyncHttpResponse[GetEnvironmentResponse] +
client.environments.create_or_update(...) -> AsyncHttpResponse[GetEnvironmentResponse]
@@ -4855,7 +4855,7 @@ client.environments.create_or_update(
-
client.environments.get(...) -> AsyncHttpResponse[GetEnvironmentResponse] +
client.environments.get(...) -> AsyncHttpResponse[GetEnvironmentResponse]
@@ -4926,7 +4926,7 @@ client.environments.get(
-
client.environments.delete(...) -> AsyncHttpResponse[bool] +
client.environments.delete(...) -> AsyncHttpResponse[bool]
@@ -4998,7 +4998,7 @@ client.environments.delete(
## Secrets -
client.secrets.list(...) -> AsyncPager[Secret, ListSecretsResponse] +
client.secrets.list(...) -> AsyncPager[Secret, ListSecretsResponse]
@@ -5104,7 +5104,7 @@ for page in response.iter_pages():
-
client.secrets.get(...) -> AsyncHttpResponse[GetSecretResponse] +
client.secrets.get(...) -> AsyncHttpResponse[GetSecretResponse]
@@ -5175,7 +5175,7 @@ client.secrets.get(
-
client.secrets.delete(...) -> AsyncHttpResponse[float] +
client.secrets.delete(...) -> AsyncHttpResponse[float]
@@ -5247,7 +5247,7 @@ client.secrets.delete(
## SecretGroups -
client.secret_groups.list(...) -> AsyncPager[SecretGroup, ListSecretGroupResponse] +
client.secret_groups.list(...) -> AsyncPager[SecretGroup, ListSecretGroupResponse]
@@ -5350,7 +5350,7 @@ for page in response.iter_pages():
-
client.secret_groups.create(...) -> AsyncHttpResponse[GetSecretGroupResponse] +
client.secret_groups.create(...) -> AsyncHttpResponse[GetSecretGroupResponse]
@@ -5444,7 +5444,7 @@ client.secret_groups.create(
-
client.secret_groups.create_or_update(...) -> AsyncHttpResponse[GetSecretGroupResponse] +
client.secret_groups.create_or_update(...) -> AsyncHttpResponse[GetSecretGroupResponse]
@@ -5524,7 +5524,7 @@ client.secret_groups.create_or_update(
-
client.secret_groups.get(...) -> AsyncHttpResponse[GetSecretGroupResponse] +
client.secret_groups.get(...) -> AsyncHttpResponse[GetSecretGroupResponse]
@@ -5595,7 +5595,7 @@ client.secret_groups.get(
-
client.secret_groups.update(...) -> AsyncHttpResponse[GetSecretGroupResponse] +
client.secret_groups.update(...) -> AsyncHttpResponse[GetSecretGroupResponse]
@@ -5679,7 +5679,7 @@ client.secret_groups.update(
-
client.secret_groups.delete(...) -> AsyncHttpResponse[DeleteSecretGroupResponse] +
client.secret_groups.delete(...) -> AsyncHttpResponse[DeleteSecretGroupResponse]
@@ -5751,7 +5751,7 @@ client.secret_groups.delete(
## Events -
client.events.get(...) -> AsyncHttpResponse[GetEventsResponse] +
client.events.get(...) -> AsyncHttpResponse[GetEventsResponse]
@@ -5867,7 +5867,7 @@ client.events.get(
## Alerts -
client.alerts.list(...) -> AsyncHttpResponse[GetAlertsResponse] +
client.alerts.list(...) -> AsyncHttpResponse[GetAlertsResponse]
@@ -5975,7 +5975,7 @@ client.alerts.list(
## Logs -
client.logs.get(...) -> AsyncHttpResponse[GetLogsResponse] +
client.logs.get(...) -> AsyncHttpResponse[GetLogsResponse]
@@ -6195,7 +6195,7 @@ client.logs.get(
## MlRepos -
client.ml_repos.create_or_update(...) -> AsyncHttpResponse[GetMlRepoResponse] +
client.ml_repos.create_or_update(...) -> AsyncHttpResponse[GetMlRepoResponse]
@@ -6275,7 +6275,7 @@ client.ml_repos.create_or_update(
-
client.ml_repos.get(...) -> AsyncHttpResponse[GetMlRepoResponse] +
client.ml_repos.get(...) -> AsyncHttpResponse[GetMlRepoResponse]
@@ -6352,7 +6352,7 @@ client.ml_repos.get(
-
client.ml_repos.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.ml_repos.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -6429,7 +6429,7 @@ client.ml_repos.delete(
-
client.ml_repos.list(...) -> AsyncPager[MlRepo, ListMlReposResponse] +
client.ml_repos.list(...) -> AsyncPager[MlRepo, ListMlReposResponse]
@@ -6530,7 +6530,7 @@ for page in response.iter_pages():
## Traces -
client.traces.query_spans(...) -> AsyncPager[TraceSpan, QuerySpansResponse] +
client.traces.query_spans(...) -> AsyncPager[TraceSpan, QuerySpansResponse]
@@ -6690,7 +6690,7 @@ for page in response.iter_pages():
## Artifacts -
client.artifacts.get(...) -> AsyncHttpResponse[GetArtifactResponse] +
client.artifacts.get(...) -> AsyncHttpResponse[GetArtifactResponse]
@@ -6747,7 +6747,7 @@ client.artifacts.get(
-
client.artifacts.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.artifacts.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -6804,7 +6804,7 @@ client.artifacts.delete(
-
client.artifacts.list(...) -> AsyncPager[Artifact, ListArtifactsResponse] +
client.artifacts.list(...) -> AsyncPager[Artifact, ListArtifactsResponse]
@@ -6920,7 +6920,7 @@ for page in response.iter_pages():
-
client.artifacts.create_or_update(...) -> AsyncHttpResponse[GetArtifactVersionResponse] +
client.artifacts.create_or_update(...) -> AsyncHttpResponse[GetArtifactVersionResponse]
@@ -6987,7 +6987,7 @@ client.artifacts.create_or_update(
## Prompts -
client.prompts.get(...) -> AsyncHttpResponse[GetPromptResponse] +
client.prompts.get(...) -> AsyncHttpResponse[GetPromptResponse]
@@ -7044,7 +7044,7 @@ client.prompts.get(
-
client.prompts.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.prompts.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -7101,7 +7101,7 @@ client.prompts.delete(
-
client.prompts.list(...) -> AsyncPager[Prompt, ListPromptsResponse] +
client.prompts.list(...) -> AsyncPager[Prompt, ListPromptsResponse]
@@ -7208,7 +7208,7 @@ for page in response.iter_pages():
-
client.prompts.create_or_update(...) -> AsyncHttpResponse[GetPromptVersionResponse] +
client.prompts.create_or_update(...) -> AsyncHttpResponse[GetPromptVersionResponse]
@@ -7275,7 +7275,7 @@ client.prompts.create_or_update(
## Models -
client.models.get(...) -> AsyncHttpResponse[GetModelResponse] +
client.models.get(...) -> AsyncHttpResponse[GetModelResponse]
@@ -7332,7 +7332,7 @@ client.models.get(
-
client.models.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.models.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -7389,7 +7389,7 @@ client.models.delete(
-
client.models.list(...) -> AsyncPager[Model, ListModelsResponse] +
client.models.list(...) -> AsyncPager[Model, ListModelsResponse]
@@ -7505,7 +7505,7 @@ for page in response.iter_pages():
-
client.models.create_or_update(...) -> AsyncHttpResponse[GetModelVersionResponse] +
client.models.create_or_update(...) -> AsyncHttpResponse[GetModelVersionResponse]
@@ -7568,7 +7568,7 @@ client.models.create_or_update(
## ArtifactVersions -
client.artifact_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse] +
client.artifact_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse]
@@ -7642,7 +7642,7 @@ client.artifact_versions.apply_tags(
-
client.artifact_versions.get(...) -> AsyncHttpResponse[GetArtifactVersionResponse] +
client.artifact_versions.get(...) -> AsyncHttpResponse[GetArtifactVersionResponse]
@@ -7713,7 +7713,7 @@ client.artifact_versions.get(
-
client.artifact_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.artifact_versions.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -7784,7 +7784,7 @@ client.artifact_versions.delete(
-
client.artifact_versions.list(...) -> AsyncPager[ArtifactVersion, ListArtifactVersionsResponse] +
client.artifact_versions.list(...) -> AsyncPager[ArtifactVersion, ListArtifactVersionsResponse]
@@ -7948,7 +7948,7 @@ for page in response.iter_pages():
-
client.artifact_versions.get_signed_urls(...) -> AsyncHttpResponse[GetSignedUrLsResponse] +
client.artifact_versions.get_signed_urls(...) -> AsyncHttpResponse[GetSignedUrLsResponse]
@@ -8023,7 +8023,7 @@ client.artifact_versions.get_signed_urls(
-
client.artifact_versions.create_multi_part_upload(...) -> AsyncHttpResponse[MultiPartUploadResponse] +
client.artifact_versions.create_multi_part_upload(...) -> AsyncHttpResponse[MultiPartUploadResponse]
@@ -8098,7 +8098,7 @@ client.artifact_versions.create_multi_part_upload(
-
client.artifact_versions.stage(...) -> AsyncHttpResponse[StageArtifactResponse] +
client.artifact_versions.stage(...) -> AsyncHttpResponse[StageArtifactResponse]
@@ -8160,7 +8160,7 @@ client.artifact_versions.stage(
-
client.artifact_versions.list_files(...) -> AsyncPager[FileInfo, ListFilesResponse] +
client.artifact_versions.list_files(...) -> AsyncPager[FileInfo, ListFilesResponse]
@@ -8246,7 +8246,7 @@ for page in response.iter_pages():
-
client.artifact_versions.mark_stage_failure(...) -> AsyncHttpResponse[EmptyResponse] +
client.artifact_versions.mark_stage_failure(...) -> AsyncHttpResponse[EmptyResponse]
@@ -8304,7 +8304,7 @@ client.artifact_versions.mark_stage_failure(
## ModelVersions -
client.model_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse] +
client.model_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse]
@@ -8378,7 +8378,7 @@ client.model_versions.apply_tags(
-
client.model_versions.get(...) -> AsyncHttpResponse[GetModelVersionResponse] +
client.model_versions.get(...) -> AsyncHttpResponse[GetModelVersionResponse]
@@ -8449,7 +8449,7 @@ client.model_versions.get(
-
client.model_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.model_versions.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -8520,7 +8520,7 @@ client.model_versions.delete(
-
client.model_versions.list(...) -> AsyncPager[ModelVersion, ListModelVersionsResponse] +
client.model_versions.list(...) -> AsyncPager[ModelVersion, ListModelVersionsResponse]
@@ -8685,7 +8685,7 @@ for page in response.iter_pages():
## PromptVersions -
client.prompt_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse] +
client.prompt_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse]
@@ -8759,7 +8759,7 @@ client.prompt_versions.apply_tags(
-
client.prompt_versions.get(...) -> AsyncHttpResponse[GetPromptVersionResponse] +
client.prompt_versions.get(...) -> AsyncHttpResponse[GetPromptVersionResponse]
@@ -8830,7 +8830,7 @@ client.prompt_versions.get(
-
client.prompt_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.prompt_versions.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -8901,7 +8901,7 @@ client.prompt_versions.delete(
-
client.prompt_versions.list(...) -> AsyncPager[PromptVersion, ListPromptVersionsResponse] +
client.prompt_versions.list(...) -> AsyncPager[PromptVersion, ListPromptVersionsResponse]
@@ -9041,7 +9041,7 @@ for page in response.iter_pages():
## DataDirectories -
client.data_directories.get(...) -> AsyncHttpResponse[GetDataDirectoryResponse] +
client.data_directories.get(...) -> AsyncHttpResponse[GetDataDirectoryResponse]
@@ -9119,7 +9119,7 @@ client.data_directories.get(
-
client.data_directories.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.data_directories.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -9207,7 +9207,7 @@ client.data_directories.delete(
-
client.data_directories.list(...) -> AsyncPager[DataDirectory, ListDataDirectoriesResponse] +
client.data_directories.list(...) -> AsyncPager[DataDirectory, ListDataDirectoriesResponse]
@@ -9330,7 +9330,7 @@ for page in response.iter_pages():
-
client.data_directories.create_or_update(...) -> AsyncHttpResponse[GetDataDirectoryResponse] +
client.data_directories.create_or_update(...) -> AsyncHttpResponse[GetDataDirectoryResponse]
@@ -9396,7 +9396,7 @@ client.data_directories.create_or_update(
-
client.data_directories.list_files(...) -> AsyncPager[FileInfo, ListFilesResponse] +
client.data_directories.list_files(...) -> AsyncPager[FileInfo, ListFilesResponse]
@@ -9503,7 +9503,7 @@ for page in response.iter_pages():
-
client.data_directories.delete_files(...) -> AsyncHttpResponse[EmptyResponse] +
client.data_directories.delete_files(...) -> AsyncHttpResponse[EmptyResponse]
@@ -9590,7 +9590,7 @@ client.data_directories.delete_files(
-
client.data_directories.get_signed_urls(...) -> AsyncHttpResponse[GetSignedUrLsResponse] +
client.data_directories.get_signed_urls(...) -> AsyncHttpResponse[GetSignedUrLsResponse]
@@ -9686,7 +9686,7 @@ client.data_directories.get_signed_urls(
-
client.data_directories.create_multipart_upload(...) -> AsyncHttpResponse[MultiPartUploadResponse] +
client.data_directories.create_multipart_upload(...) -> AsyncHttpResponse[MultiPartUploadResponse]
@@ -9783,7 +9783,7 @@ client.data_directories.create_multipart_upload(
## Internal Users -
client.internal.users.get_info() -> AsyncHttpResponse[Session] +
client.internal.users.get_info() -> AsyncHttpResponse[Session]
@@ -9845,7 +9845,7 @@ client.internal.users.get_info()
## Internal AiGateway -
client.internal.ai_gateway.get_gateway_config(...) -> AsyncHttpResponse[GatewayConfiguration] +
client.internal.ai_gateway.get_gateway_config(...) -> AsyncHttpResponse[GatewayConfiguration]
@@ -9920,7 +9920,7 @@ client.internal.ai_gateway.get_gateway_config(
## Internal Clusters -
client.internal.clusters.get_autoprovisioning_state(...) -> AsyncHttpResponse[GetAutoProvisioningStateResponse] +
client.internal.clusters.get_autoprovisioning_state(...) -> AsyncHttpResponse[GetAutoProvisioningStateResponse]
@@ -9992,7 +9992,7 @@ client.internal.clusters.get_autoprovisioning_state(
## Internal Deployments -
client.internal.deployments.get_deployment_statuses(...) -> AsyncHttpResponse[typing.List[DeploymentStatus]] +
client.internal.deployments.get_deployment_statuses(...) -> AsyncHttpResponse[typing.List[DeploymentStatus]]
@@ -10072,7 +10072,7 @@ client.internal.deployments.get_deployment_statuses(
-
client.internal.deployments.get_builds(...) -> AsyncHttpResponse[typing.List[DeploymentBuild]] +
client.internal.deployments.get_builds(...) -> AsyncHttpResponse[typing.List[DeploymentBuild]]
@@ -10152,7 +10152,7 @@ client.internal.deployments.get_builds(
-
client.internal.deployments.get_code_upload_url(...) -> AsyncHttpResponse[PresignedUrlObject] +
client.internal.deployments.get_code_upload_url(...) -> AsyncHttpResponse[PresignedUrlObject]
@@ -10232,7 +10232,7 @@ client.internal.deployments.get_code_upload_url(
-
client.internal.deployments.get_suggested_endpoint(...) -> AsyncHttpResponse[GetSuggestedDeploymentEndpointResponse] +
client.internal.deployments.get_suggested_endpoint(...) -> AsyncHttpResponse[GetSuggestedDeploymentEndpointResponse]
@@ -10349,7 +10349,7 @@ client.internal.deployments.get_suggested_endpoint(
## Internal Applications -
client.internal.applications.promote_rollout(...) -> AsyncHttpResponse[None] +
client.internal.applications.promote_rollout(...) -> AsyncHttpResponse[None]
@@ -10429,7 +10429,7 @@ client.internal.applications.promote_rollout(
-
client.internal.applications.get_pod_template_hash_to_deployment_version(...) -> AsyncHttpResponse[typing.Dict[str, float]] +
client.internal.applications.get_pod_template_hash_to_deployment_version(...) -> AsyncHttpResponse[typing.Dict[str, float]]
@@ -10510,7 +10510,7 @@ client.internal.applications.get_pod_template_hash_to_deployment_version(
## Internal Metrics -
client.internal.metrics.get_charts(...) -> AsyncHttpResponse[GetChartsResponse] +
client.internal.metrics.get_charts(...) -> AsyncHttpResponse[GetChartsResponse]
@@ -10628,7 +10628,7 @@ client.internal.metrics.get_charts(
## Internal Vcs -
client.internal.vcs.get_repository_details(...) -> AsyncHttpResponse[GitRepositoryExistsResponse] +
client.internal.vcs.get_repository_details(...) -> AsyncHttpResponse[GitRepositoryExistsResponse]
@@ -10693,7 +10693,7 @@ client.internal.vcs.get_repository_details(
-
client.internal.vcs.get_authenticated_url(...) -> AsyncHttpResponse[GetAuthenticatedVcsurlResponse] +
client.internal.vcs.get_authenticated_url(...) -> AsyncHttpResponse[GetAuthenticatedVcsurlResponse]
@@ -10751,7 +10751,7 @@ client.internal.vcs.get_authenticated_url(
## Internal DockerRegistries -
client.internal.docker_registries.create_repository(...) -> AsyncHttpResponse[DockerRegistriesCreateRepositoryResponse] +
client.internal.docker_registries.create_repository(...) -> AsyncHttpResponse[DockerRegistriesCreateRepositoryResponse]
@@ -10840,7 +10840,7 @@ client.internal.docker_registries.create_repository(
-
client.internal.docker_registries.get_credentials(...) -> AsyncHttpResponse[DockerRegistriesGetCredentialsResponse] +
client.internal.docker_registries.get_credentials(...) -> AsyncHttpResponse[DockerRegistriesGetCredentialsResponse]
@@ -10921,7 +10921,7 @@ client.internal.docker_registries.get_credentials(
## Internal Workflows -
client.internal.workflows.execute_workflow(...) -> AsyncHttpResponse[WorkflowsExecuteWorkflowResponse] +
client.internal.workflows.execute_workflow(...) -> AsyncHttpResponse[WorkflowsExecuteWorkflowResponse]
@@ -11009,7 +11009,7 @@ client.internal.workflows.execute_workflow(
## Internal BuildLogs -
client.internal.build_logs.get(...) -> AsyncHttpResponse[LogsResponse] +
client.internal.build_logs.get(...) -> AsyncHttpResponse[LogsResponse]
@@ -11134,7 +11134,7 @@ client.internal.build_logs.get(
## Internal ArtifactVersions -
client.internal.artifact_versions.list(...) -> AsyncPager[ +
client.internal.artifact_versions.list(...) -> AsyncPager[ InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse, ] @@ -11311,7 +11311,7 @@ for page in response.iter_pages():
## Internal Ml -
client.internal.ml.apply(...) -> AsyncHttpResponse[ApplyMlEntityResponse] +
client.internal.ml.apply(...) -> AsyncHttpResponse[ApplyMlEntityResponse]
@@ -11373,7 +11373,7 @@ client.internal.ml.apply(
-
client.internal.ml.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.internal.ml.delete(...) -> AsyncHttpResponse[EmptyResponse]
diff --git a/src/truefoundry_sdk/_wrapped_clients.py b/src/truefoundry_sdk/_wrapped_clients.py index 6a3388a..727ddec 100644 --- a/src/truefoundry_sdk/_wrapped_clients.py +++ b/src/truefoundry_sdk/_wrapped_clients.py @@ -48,7 +48,7 @@ def _get_by_fqn(client: HasListMethod[T, R], *, fqn: str, request_options: Optio raise NotFoundError( body=HttpError( message=f"No entity found with fqn {fqn}", - status_code=404, + statusCode=404, ) ) return result @@ -67,7 +67,7 @@ async def _aget_by_fqn( raise NotFoundError( body=HttpError( message=f"No entity found with fqn {fqn}", - status_code=404, + statusCode=404, ) ) return result diff --git a/src/truefoundry_sdk/application_versions/raw_client.py b/src/truefoundry_sdk/application_versions/raw_client.py index f9050ce..fb685a3 100644 --- a/src/truefoundry_sdk/application_versions/raw_client.py +++ b/src/truefoundry_sdk/application_versions/raw_client.py @@ -87,7 +87,7 @@ def list( _get_next = lambda: self.list( id, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), version=version, deployment_id=deployment_id, request_options=request_options, @@ -256,7 +256,7 @@ async def _get_next(): return await self.list( id, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), version=version, deployment_id=deployment_id, request_options=request_options, diff --git a/src/truefoundry_sdk/applications/raw_client.py b/src/truefoundry_sdk/applications/raw_client.py index 7f4fb39..8fb2e99 100644 --- a/src/truefoundry_sdk/applications/raw_client.py +++ b/src/truefoundry_sdk/applications/raw_client.py @@ -160,7 +160,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), application_id=application_id, workspace_id=workspace_id, application_name=application_name, @@ -800,7 +800,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), application_id=application_id, workspace_id=workspace_id, application_name=application_name, diff --git a/src/truefoundry_sdk/artifact_versions/raw_client.py b/src/truefoundry_sdk/artifact_versions/raw_client.py index 6296192..335f56f 100644 --- a/src/truefoundry_sdk/artifact_versions/raw_client.py +++ b/src/truefoundry_sdk/artifact_versions/raw_client.py @@ -286,7 +286,7 @@ def list( version=version, run_ids=run_ids, run_steps=run_steps, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_internal_metadata=include_internal_metadata, request_options=request_options, @@ -886,7 +886,7 @@ async def _get_next(): version=version, run_ids=run_ids, run_steps=run_steps, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_internal_metadata=include_internal_metadata, request_options=request_options, diff --git a/src/truefoundry_sdk/artifacts/raw_client.py b/src/truefoundry_sdk/artifacts/raw_client.py index 1160b1b..4b2b8b3 100644 --- a/src/truefoundry_sdk/artifacts/raw_client.py +++ b/src/truefoundry_sdk/artifacts/raw_client.py @@ -189,7 +189,7 @@ def list( fqn=fqn, ml_repo_id=ml_repo_id, name=name, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, run_id=run_id, include_empty_artifacts=include_empty_artifacts, @@ -437,7 +437,7 @@ async def _get_next(): fqn=fqn, ml_repo_id=ml_repo_id, name=name, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, run_id=run_id, include_empty_artifacts=include_empty_artifacts, diff --git a/src/truefoundry_sdk/clusters/raw_client.py b/src/truefoundry_sdk/clusters/raw_client.py index df051ad..8bb981d 100644 --- a/src/truefoundry_sdk/clusters/raw_client.py +++ b/src/truefoundry_sdk/clusters/raw_client.py @@ -82,7 +82,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -496,7 +496,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) diff --git a/src/truefoundry_sdk/core/client_wrapper.py b/src/truefoundry_sdk/core/client_wrapper.py index 6cec980..18d1f33 100644 --- a/src/truefoundry_sdk/core/client_wrapper.py +++ b/src/truefoundry_sdk/core/client_wrapper.py @@ -21,9 +21,13 @@ def __init__( self._timeout = timeout def get_headers(self) -> typing.Dict[str, str]: + import platform + headers: typing.Dict[str, str] = { "User-Agent": "truefoundry-sdk/0.0.0", "X-Fern-Language": "Python", + "X-Fern-Runtime": f"python/{platform.python_version()}", + "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "truefoundry-sdk", "X-Fern-SDK-Version": "0.0.0", **(self.get_custom_headers() or {}), diff --git a/src/truefoundry_sdk/core/http_client.py b/src/truefoundry_sdk/core/http_client.py index f4a7c07..7c6c936 100644 --- a/src/truefoundry_sdk/core/http_client.py +++ b/src/truefoundry_sdk/core/http_client.py @@ -5,7 +5,6 @@ import re import time import typing -import urllib.parse from contextlib import asynccontextmanager, contextmanager from random import random @@ -123,6 +122,30 @@ def _should_retry(response: httpx.Response) -> bool: return response.status_code >= 500 or response.status_code in retryable_400s +def _build_url(base_url: str, path: typing.Optional[str]) -> str: + """ + Build a full URL by joining a base URL with a path. + + This function correctly handles base URLs that contain path prefixes (e.g., tenant-based URLs) + by using string concatenation instead of urllib.parse.urljoin(), which would incorrectly + strip path components when the path starts with '/'. + + Example: + >>> _build_url("https://cloud.example.com/org/tenant/api", "/users") + 'https://cloud.example.com/org/tenant/api/users' + + Args: + base_url: The base URL, which may contain path prefixes. + path: The path to append. Can be None or empty string. + + Returns: + The full URL with base_url and path properly joined. + """ + if not path: + return base_url + return f"{base_url.rstrip('/')}/{path.lstrip('/')}" + + def _maybe_filter_none_from_multipart_data( data: typing.Optional[typing.Any], request_files: typing.Optional[RequestFiles], @@ -192,8 +215,19 @@ def get_request_body( # If both data and json are None, we send json data in the event extra properties are specified json_body = maybe_filter_request_body(json, request_options, omit) - # If you have an empty JSON body, you should just send None - return (json_body if json_body != {} else None), data_body if data_body != {} else None + has_additional_body_parameters = bool( + request_options is not None and request_options.get("additional_body_parameters") + ) + + # Only collapse empty dict to None when the body was not explicitly provided + # and there are no additional body parameters. This preserves explicit empty + # bodies (e.g., when an endpoint has a request body type but all fields are optional). + if json_body == {} and json is None and not has_additional_body_parameters: + json_body = None + if data_body == {} and data is None and not has_additional_body_parameters: + data_body = None + + return json_body, data_body class HttpClient: @@ -237,7 +271,7 @@ def request( ] = None, headers: typing.Optional[typing.Dict[str, typing.Any]] = None, request_options: typing.Optional[RequestOptions] = None, - retries: int = 2, + retries: int = 0, omit: typing.Optional[typing.Any] = None, force_multipart: typing.Optional[bool] = None, ) -> httpx.Response: @@ -261,9 +295,29 @@ def request( data_body = _maybe_filter_none_from_multipart_data(data_body, request_files, force_multipart) + # Compute encoded params separately to avoid passing empty list to httpx + # (httpx strips existing query params from URL when params=[] is passed) + _encoded_params = encode_query( + jsonable_encoder( + remove_none_from_dict( + remove_omit_from_dict( + { + **(params if params is not None else {}), + **( + request_options.get("additional_query_parameters", {}) or {} + if request_options is not None + else {} + ), + }, + omit, + ) + ) + ) + ) + response = self.httpx_client.request( method=method, - url=urllib.parse.urljoin(f"{base_url}/", path), + url=_build_url(base_url, path), headers=jsonable_encoder( remove_none_from_dict( { @@ -273,23 +327,7 @@ def request( } ) ), - params=encode_query( - jsonable_encoder( - remove_none_from_dict( - remove_omit_from_dict( - { - **(params if params is not None else {}), - **( - request_options.get("additional_query_parameters", {}) or {} - if request_options is not None - else {} - ), - }, - omit, - ) - ) - ) - ), + params=_encoded_params if _encoded_params else None, json=json_body, data=data_body, content=content, @@ -297,9 +335,9 @@ def request( timeout=timeout, ) - max_retries: int = request_options.get("max_retries", 0) if request_options is not None else 0 + max_retries: int = request_options.get("max_retries", 2) if request_options is not None else 2 if _should_retry(response=response): - if max_retries > retries: + if retries < max_retries: time.sleep(_retry_timeout(response=response, retries=retries)) return self.request( path=path, @@ -336,7 +374,7 @@ def stream( ] = None, headers: typing.Optional[typing.Dict[str, typing.Any]] = None, request_options: typing.Optional[RequestOptions] = None, - retries: int = 2, + retries: int = 0, omit: typing.Optional[typing.Any] = None, force_multipart: typing.Optional[bool] = None, ) -> typing.Iterator[httpx.Response]: @@ -360,9 +398,29 @@ def stream( data_body = _maybe_filter_none_from_multipart_data(data_body, request_files, force_multipart) + # Compute encoded params separately to avoid passing empty list to httpx + # (httpx strips existing query params from URL when params=[] is passed) + _encoded_params = encode_query( + jsonable_encoder( + remove_none_from_dict( + remove_omit_from_dict( + { + **(params if params is not None else {}), + **( + request_options.get("additional_query_parameters", {}) + if request_options is not None + else {} + ), + }, + omit, + ) + ) + ) + ) + with self.httpx_client.stream( method=method, - url=urllib.parse.urljoin(f"{base_url}/", path), + url=_build_url(base_url, path), headers=jsonable_encoder( remove_none_from_dict( { @@ -372,23 +430,7 @@ def stream( } ) ), - params=encode_query( - jsonable_encoder( - remove_none_from_dict( - remove_omit_from_dict( - { - **(params if params is not None else {}), - **( - request_options.get("additional_query_parameters", {}) - if request_options is not None - else {} - ), - }, - omit, - ) - ) - ) - ), + params=_encoded_params if _encoded_params else None, json=json_body, data=data_body, content=content, @@ -446,7 +488,7 @@ async def request( ] = None, headers: typing.Optional[typing.Dict[str, typing.Any]] = None, request_options: typing.Optional[RequestOptions] = None, - retries: int = 2, + retries: int = 0, omit: typing.Optional[typing.Any] = None, force_multipart: typing.Optional[bool] = None, ) -> httpx.Response: @@ -473,10 +515,30 @@ async def request( # Get headers (supports async token providers) _headers = await self._get_headers() + # Compute encoded params separately to avoid passing empty list to httpx + # (httpx strips existing query params from URL when params=[] is passed) + _encoded_params = encode_query( + jsonable_encoder( + remove_none_from_dict( + remove_omit_from_dict( + { + **(params if params is not None else {}), + **( + request_options.get("additional_query_parameters", {}) or {} + if request_options is not None + else {} + ), + }, + omit, + ) + ) + ) + ) + # Add the input to each of these and do None-safety checks response = await self.httpx_client.request( method=method, - url=urllib.parse.urljoin(f"{base_url}/", path), + url=_build_url(base_url, path), headers=jsonable_encoder( remove_none_from_dict( { @@ -486,23 +548,7 @@ async def request( } ) ), - params=encode_query( - jsonable_encoder( - remove_none_from_dict( - remove_omit_from_dict( - { - **(params if params is not None else {}), - **( - request_options.get("additional_query_parameters", {}) or {} - if request_options is not None - else {} - ), - }, - omit, - ) - ) - ) - ), + params=_encoded_params if _encoded_params else None, json=json_body, data=data_body, content=content, @@ -510,9 +556,9 @@ async def request( timeout=timeout, ) - max_retries: int = request_options.get("max_retries", 0) if request_options is not None else 0 + max_retries: int = request_options.get("max_retries", 2) if request_options is not None else 2 if _should_retry(response=response): - if max_retries > retries: + if retries < max_retries: await asyncio.sleep(_retry_timeout(response=response, retries=retries)) return await self.request( path=path, @@ -548,7 +594,7 @@ async def stream( ] = None, headers: typing.Optional[typing.Dict[str, typing.Any]] = None, request_options: typing.Optional[RequestOptions] = None, - retries: int = 2, + retries: int = 0, omit: typing.Optional[typing.Any] = None, force_multipart: typing.Optional[bool] = None, ) -> typing.AsyncIterator[httpx.Response]: @@ -575,9 +621,29 @@ async def stream( # Get headers (supports async token providers) _headers = await self._get_headers() + # Compute encoded params separately to avoid passing empty list to httpx + # (httpx strips existing query params from URL when params=[] is passed) + _encoded_params = encode_query( + jsonable_encoder( + remove_none_from_dict( + remove_omit_from_dict( + { + **(params if params is not None else {}), + **( + request_options.get("additional_query_parameters", {}) + if request_options is not None + else {} + ), + }, + omit=omit, + ) + ) + ) + ) + async with self.httpx_client.stream( method=method, - url=urllib.parse.urljoin(f"{base_url}/", path), + url=_build_url(base_url, path), headers=jsonable_encoder( remove_none_from_dict( { @@ -587,23 +653,7 @@ async def stream( } ) ), - params=encode_query( - jsonable_encoder( - remove_none_from_dict( - remove_omit_from_dict( - { - **(params if params is not None else {}), - **( - request_options.get("additional_query_parameters", {}) - if request_options is not None - else {} - ), - }, - omit=omit, - ) - ) - ) - ), + params=_encoded_params if _encoded_params else None, json=json_body, data=data_body, content=content, diff --git a/src/truefoundry_sdk/core/http_response.py b/src/truefoundry_sdk/core/http_response.py index 2479747..00bb109 100644 --- a/src/truefoundry_sdk/core/http_response.py +++ b/src/truefoundry_sdk/core/http_response.py @@ -9,7 +9,7 @@ class BaseHttpResponse: - """Minimalist HTTP response wrapper that exposes response headers.""" + """Minimalist HTTP response wrapper that exposes response headers and status code.""" _response: httpx.Response @@ -20,6 +20,10 @@ def __init__(self, response: httpx.Response): def headers(self) -> Dict[str, str]: return dict(self._response.headers) + @property + def status_code(self) -> int: + return self._response.status_code + class HttpResponse(Generic[T], BaseHttpResponse): """HTTP response wrapper that exposes response headers and data.""" diff --git a/src/truefoundry_sdk/core/jsonable_encoder.py b/src/truefoundry_sdk/core/jsonable_encoder.py index afee366..f8beaea 100644 --- a/src/truefoundry_sdk/core/jsonable_encoder.py +++ b/src/truefoundry_sdk/core/jsonable_encoder.py @@ -30,6 +30,10 @@ def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any], Any]]] = None) -> Any: custom_encoder = custom_encoder or {} + # Generated SDKs use Ellipsis (`...`) as the sentinel value for "OMIT". + # OMIT values should be excluded from serialized payloads. + if obj is Ellipsis: + return None if custom_encoder: if type(obj) in custom_encoder: return custom_encoder[type(obj)](obj) @@ -70,6 +74,8 @@ def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any] allowed_keys = set(obj.keys()) for key, value in obj.items(): if key in allowed_keys: + if value is Ellipsis: + continue encoded_key = jsonable_encoder(key, custom_encoder=custom_encoder) encoded_value = jsonable_encoder(value, custom_encoder=custom_encoder) encoded_dict[encoded_key] = encoded_value @@ -77,6 +83,8 @@ def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any] if isinstance(obj, (list, set, frozenset, GeneratorType, tuple)): encoded_list = [] for item in obj: + if item is Ellipsis: + continue encoded_list.append(jsonable_encoder(item, custom_encoder=custom_encoder)) return encoded_list diff --git a/src/truefoundry_sdk/core/pydantic_utilities.py b/src/truefoundry_sdk/core/pydantic_utilities.py index 185e5c4..789081b 100644 --- a/src/truefoundry_sdk/core/pydantic_utilities.py +++ b/src/truefoundry_sdk/core/pydantic_utilities.py @@ -2,10 +2,35 @@ # nopycln: file import datetime as dt +import inspect +import json +import logging from collections import defaultdict -from typing import Any, Callable, ClassVar, Dict, List, Mapping, Optional, Set, Tuple, Type, TypeVar, Union, cast +from dataclasses import asdict +from typing import ( + TYPE_CHECKING, + Any, + Callable, + ClassVar, + Dict, + List, + Mapping, + Optional, + Set, + Tuple, + Type, + TypeVar, + Union, + cast, +) import pydantic +import typing_extensions + +_logger = logging.getLogger(__name__) + +if TYPE_CHECKING: + from .http_sse._models import ServerSentEvent IS_PYDANTIC_V2 = pydantic.VERSION.startswith("2.") @@ -36,8 +61,212 @@ Model = TypeVar("Model", bound=pydantic.BaseModel) +def _get_discriminator_and_variants(type_: Type[Any]) -> Tuple[Optional[str], Optional[List[Type[Any]]]]: + """ + Extract the discriminator field name and union variants from a discriminated union type. + Supports Annotated[Union[...], Field(discriminator=...)] patterns. + Returns (discriminator, variants) or (None, None) if not a discriminated union. + """ + origin = typing_extensions.get_origin(type_) + + if origin is typing_extensions.Annotated: + args = typing_extensions.get_args(type_) + if len(args) >= 2: + inner_type = args[0] + # Check annotations for discriminator + discriminator = None + for annotation in args[1:]: + if hasattr(annotation, "discriminator"): + discriminator = getattr(annotation, "discriminator", None) + break + + if discriminator: + inner_origin = typing_extensions.get_origin(inner_type) + if inner_origin is Union: + variants = list(typing_extensions.get_args(inner_type)) + return discriminator, variants + return None, None + + +def _get_field_annotation(model: Type[Any], field_name: str) -> Optional[Type[Any]]: + """Get the type annotation of a field from a Pydantic model.""" + if IS_PYDANTIC_V2: + fields = getattr(model, "model_fields", {}) + field_info = fields.get(field_name) + if field_info: + return cast(Optional[Type[Any]], field_info.annotation) + else: + fields = getattr(model, "__fields__", {}) + field_info = fields.get(field_name) + if field_info: + return cast(Optional[Type[Any]], field_info.outer_type_) + return None + + +def _find_variant_by_discriminator( + variants: List[Type[Any]], + discriminator: str, + discriminator_value: Any, +) -> Optional[Type[Any]]: + """Find the union variant that matches the discriminator value.""" + for variant in variants: + if not (inspect.isclass(variant) and issubclass(variant, pydantic.BaseModel)): + continue + + disc_annotation = _get_field_annotation(variant, discriminator) + if disc_annotation and is_literal_type(disc_annotation): + literal_args = get_args(disc_annotation) + if literal_args and literal_args[0] == discriminator_value: + return variant + return None + + +def _is_string_type(type_: Type[Any]) -> bool: + """Check if a type is str or Optional[str].""" + if type_ is str: + return True + + origin = typing_extensions.get_origin(type_) + if origin is Union: + args = typing_extensions.get_args(type_) + # Optional[str] = Union[str, None] + non_none_args = [a for a in args if a is not type(None)] + if len(non_none_args) == 1 and non_none_args[0] is str: + return True + + return False + + +def parse_sse_obj(sse: "ServerSentEvent", type_: Type[T]) -> T: + """ + Parse a ServerSentEvent into the appropriate type. + + Handles two scenarios based on where the discriminator field is located: + + 1. Data-level discrimination: The discriminator (e.g., 'type') is inside the 'data' payload. + The union describes the data content, not the SSE envelope. + -> Returns: json.loads(data) parsed into the type + + Example: ChatStreamResponse with discriminator='type' + Input: ServerSentEvent(event="message", data='{"type": "content-delta", ...}', id="") + Output: ContentDeltaEvent (parsed from data, SSE envelope stripped) + + 2. Event-level discrimination: The discriminator (e.g., 'event') is at the SSE event level. + The union describes the full SSE event structure. + -> Returns: SSE envelope with 'data' field JSON-parsed only if the variant expects non-string + + Example: JobStreamResponse with discriminator='event' + Input: ServerSentEvent(event="ERROR", data='{"code": "FAILED", ...}', id="123") + Output: JobStreamResponse_Error with data as ErrorData object + + But for variants where data is str (like STATUS_UPDATE): + Input: ServerSentEvent(event="STATUS_UPDATE", data='{"status": "processing"}', id="1") + Output: JobStreamResponse_StatusUpdate with data as string (not parsed) + + Args: + sse: The ServerSentEvent object to parse + type_: The target discriminated union type + + Returns: + The parsed object of type T + + Note: + This function is only available in SDK contexts where http_sse module exists. + """ + sse_event = asdict(sse) + discriminator, variants = _get_discriminator_and_variants(type_) + + if discriminator is None or variants is None: + # Not a discriminated union - parse the data field as JSON + data_value = sse_event.get("data") + if isinstance(data_value, str) and data_value: + try: + parsed_data = json.loads(data_value) + return parse_obj_as(type_, parsed_data) + except json.JSONDecodeError as e: + _logger.warning( + "Failed to parse SSE data field as JSON: %s, data: %s", + e, + data_value[:100] if len(data_value) > 100 else data_value, + ) + return parse_obj_as(type_, sse_event) + + data_value = sse_event.get("data") + + # Check if discriminator is at the top level (event-level discrimination) + if discriminator in sse_event: + # Case 2: Event-level discrimination + # Find the matching variant to check if 'data' field needs JSON parsing + disc_value = sse_event.get(discriminator) + matching_variant = _find_variant_by_discriminator(variants, discriminator, disc_value) + + if matching_variant is not None: + # Check what type the variant expects for 'data' + data_type = _get_field_annotation(matching_variant, "data") + if data_type is not None and not _is_string_type(data_type): + # Variant expects non-string data - parse JSON + if isinstance(data_value, str) and data_value: + try: + parsed_data = json.loads(data_value) + new_object = dict(sse_event) + new_object["data"] = parsed_data + return parse_obj_as(type_, new_object) + except json.JSONDecodeError as e: + _logger.warning( + "Failed to parse SSE data field as JSON for event-level discrimination: %s, data: %s", + e, + data_value[:100] if len(data_value) > 100 else data_value, + ) + # Either no matching variant, data is string type, or JSON parse failed + return parse_obj_as(type_, sse_event) + + else: + # Case 1: Data-level discrimination + # The discriminator is inside the data payload - extract and parse data only + if isinstance(data_value, str) and data_value: + try: + parsed_data = json.loads(data_value) + return parse_obj_as(type_, parsed_data) + except json.JSONDecodeError as e: + _logger.warning( + "Failed to parse SSE data field as JSON for data-level discrimination: %s, data: %s", + e, + data_value[:100] if len(data_value) > 100 else data_value, + ) + return parse_obj_as(type_, sse_event) + + def parse_obj_as(type_: Type[T], object_: Any) -> T: - dealiased_object = convert_and_respect_annotation_metadata(object_=object_, annotation=type_, direction="read") + # convert_and_respect_annotation_metadata is required for TypedDict aliasing. + # + # For Pydantic models, whether we should pre-dealias depends on how the model encodes aliasing: + # - If the model uses real Pydantic aliases (pydantic.Field(alias=...)), then we must pass wire keys through + # unchanged so Pydantic can validate them. + # - If the model encodes aliasing only via FieldMetadata annotations, then we MUST pre-dealias because Pydantic + # will not recognize those aliases during validation. + if inspect.isclass(type_) and issubclass(type_, pydantic.BaseModel): + has_pydantic_aliases = False + if IS_PYDANTIC_V2: + for field_name, field_info in getattr(type_, "model_fields", {}).items(): # type: ignore[attr-defined] + alias = getattr(field_info, "alias", None) + if alias is not None and alias != field_name: + has_pydantic_aliases = True + break + else: + for field in getattr(type_, "__fields__", {}).values(): + alias = getattr(field, "alias", None) + name = getattr(field, "name", None) + if alias is not None and name is not None and alias != name: + has_pydantic_aliases = True + break + + dealiased_object = ( + object_ + if has_pydantic_aliases + else convert_and_respect_annotation_metadata(object_=object_, annotation=type_, direction="read") + ) + else: + dealiased_object = convert_and_respect_annotation_metadata(object_=object_, annotation=type_, direction="read") if IS_PYDANTIC_V2: adapter = pydantic.TypeAdapter(type_) # type: ignore[attr-defined] return adapter.validate_python(dealiased_object) @@ -59,6 +288,43 @@ class UniversalBaseModel(pydantic.BaseModel): protected_namespaces=(), ) + @pydantic.model_validator(mode="before") # type: ignore[attr-defined] + @classmethod + def _coerce_field_names_to_aliases(cls, data: Any) -> Any: + """ + Accept Python field names in input by rewriting them to their Pydantic aliases, + while avoiding silent collisions when a key could refer to multiple fields. + """ + if not isinstance(data, Mapping): + return data + + fields = getattr(cls, "model_fields", {}) # type: ignore[attr-defined] + name_to_alias: Dict[str, str] = {} + alias_to_name: Dict[str, str] = {} + + for name, field_info in fields.items(): + alias = getattr(field_info, "alias", None) or name + name_to_alias[name] = alias + if alias != name: + alias_to_name[alias] = name + + # Detect ambiguous keys: a key that is an alias for one field and a name for another. + ambiguous_keys = set(alias_to_name.keys()).intersection(set(name_to_alias.keys())) + for key in ambiguous_keys: + if key in data and name_to_alias[key] not in data: + raise ValueError( + f"Ambiguous input key '{key}': it is both a field name and an alias. " + "Provide the explicit alias key to disambiguate." + ) + + original_keys = set(data.keys()) + rewritten: Dict[str, Any] = dict(data) + for name, alias in name_to_alias.items(): + if alias != name and name in original_keys and alias not in rewritten: + rewritten[alias] = rewritten.pop(name) + + return rewritten + @pydantic.model_serializer(mode="plain", when_used="json") # type: ignore[attr-defined] def serialize_model(self) -> Any: # type: ignore[name-defined] serialized = self.dict() # type: ignore[attr-defined] @@ -71,6 +337,40 @@ class Config: smart_union = True json_encoders = {dt.datetime: serialize_datetime} + @pydantic.root_validator(pre=True) + def _coerce_field_names_to_aliases(cls, values: Any) -> Any: + """ + Pydantic v1 equivalent of _coerce_field_names_to_aliases. + """ + if not isinstance(values, Mapping): + return values + + fields = getattr(cls, "__fields__", {}) + name_to_alias: Dict[str, str] = {} + alias_to_name: Dict[str, str] = {} + + for name, field in fields.items(): + alias = getattr(field, "alias", None) or name + name_to_alias[name] = alias + if alias != name: + alias_to_name[alias] = name + + ambiguous_keys = set(alias_to_name.keys()).intersection(set(name_to_alias.keys())) + for key in ambiguous_keys: + if key in values and name_to_alias[key] not in values: + raise ValueError( + f"Ambiguous input key '{key}': it is both a field name and an alias. " + "Provide the explicit alias key to disambiguate." + ) + + original_keys = set(values.keys()) + rewritten: Dict[str, Any] = dict(values) + for name, alias in name_to_alias.items(): + if alias != name and name in original_keys and alias not in rewritten: + rewritten[alias] = rewritten.pop(name) + + return rewritten + @classmethod def model_construct(cls: Type["Model"], _fields_set: Optional[Set[str]] = None, **values: Any) -> "Model": dealiased_object = convert_and_respect_annotation_metadata(object_=values, annotation=cls, direction="read") diff --git a/src/truefoundry_sdk/data_directories/raw_client.py b/src/truefoundry_sdk/data_directories/raw_client.py index 9c3190f..13c03d7 100644 --- a/src/truefoundry_sdk/data_directories/raw_client.py +++ b/src/truefoundry_sdk/data_directories/raw_client.py @@ -227,7 +227,7 @@ def list( ml_repo_id=ml_repo_id, name=name, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -806,7 +806,7 @@ async def _get_next(): ml_repo_id=ml_repo_id, name=name, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) diff --git a/src/truefoundry_sdk/environments/raw_client.py b/src/truefoundry_sdk/environments/raw_client.py index 779c08c..42bf025 100644 --- a/src/truefoundry_sdk/environments/raw_client.py +++ b/src/truefoundry_sdk/environments/raw_client.py @@ -78,7 +78,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -309,7 +309,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) diff --git a/src/truefoundry_sdk/internal/artifact_versions/raw_client.py b/src/truefoundry_sdk/internal/artifact_versions/raw_client.py index 4bbee05..56f5859 100644 --- a/src/truefoundry_sdk/internal/artifact_versions/raw_client.py +++ b/src/truefoundry_sdk/internal/artifact_versions/raw_client.py @@ -112,7 +112,7 @@ def list( version=version, run_ids=run_ids, run_steps=run_steps, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_internal_metadata=include_internal_metadata, include_model_versions=include_model_versions, @@ -237,7 +237,7 @@ async def _get_next(): version=version, run_ids=run_ids, run_steps=run_steps, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_internal_metadata=include_internal_metadata, include_model_versions=include_model_versions, diff --git a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_create_repository_response.py b/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_create_repository_response.py index 678c5e4..68e866d 100644 --- a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_create_repository_response.py +++ b/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_create_repository_response.py @@ -9,7 +9,9 @@ class DockerRegistriesCreateRepositoryResponse(UniversalBaseModel): - repo_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="repoName")] = None + repo_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="repoName")] = pydantic.Field( + alias="repoName", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_get_credentials_response.py b/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_get_credentials_response.py index 033ffe9..002717a 100644 --- a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_get_credentials_response.py +++ b/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_get_credentials_response.py @@ -15,7 +15,7 @@ class DockerRegistriesGetCredentialsResponse(UniversalBaseModel): """ registry_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="registryUrl")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="registryUrl", default=None) ) """ Docker registry URL diff --git a/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py b/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py index a1255a8..73238ca 100644 --- a/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py +++ b/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py @@ -10,7 +10,7 @@ class WorkflowsExecuteWorkflowResponse(UniversalBaseModel): execution_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="executionName")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="executionName", default=None) ) """ The name of the execution diff --git a/src/truefoundry_sdk/jobs/raw_client.py b/src/truefoundry_sdk/jobs/raw_client.py index c00e544..fbc137b 100644 --- a/src/truefoundry_sdk/jobs/raw_client.py +++ b/src/truefoundry_sdk/jobs/raw_client.py @@ -123,7 +123,7 @@ def list_runs( _get_next = lambda: self.list_runs( job_id, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), search_prefix=search_prefix, sort_by=sort_by, order=order, @@ -604,7 +604,7 @@ async def _get_next(): return await self.list_runs( job_id, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), search_prefix=search_prefix, sort_by=sort_by, order=order, diff --git a/src/truefoundry_sdk/ml_repos/raw_client.py b/src/truefoundry_sdk/ml_repos/raw_client.py index 10afdce..c63fafe 100644 --- a/src/truefoundry_sdk/ml_repos/raw_client.py +++ b/src/truefoundry_sdk/ml_repos/raw_client.py @@ -291,7 +291,7 @@ def list( _get_next = lambda: self.list( name=name, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -579,7 +579,7 @@ async def _get_next(): return await self.list( name=name, limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) diff --git a/src/truefoundry_sdk/model_versions/raw_client.py b/src/truefoundry_sdk/model_versions/raw_client.py index f7138a4..2fa4d56 100644 --- a/src/truefoundry_sdk/model_versions/raw_client.py +++ b/src/truefoundry_sdk/model_versions/raw_client.py @@ -278,7 +278,7 @@ def list( version=version, run_ids=run_ids, run_steps=run_steps, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_internal_metadata=include_internal_metadata, request_options=request_options, @@ -561,7 +561,7 @@ async def _get_next(): version=version, run_ids=run_ids, run_steps=run_steps, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_internal_metadata=include_internal_metadata, request_options=request_options, diff --git a/src/truefoundry_sdk/models/raw_client.py b/src/truefoundry_sdk/models/raw_client.py index eab7680..96efc07 100644 --- a/src/truefoundry_sdk/models/raw_client.py +++ b/src/truefoundry_sdk/models/raw_client.py @@ -189,7 +189,7 @@ def list( fqn=fqn, ml_repo_id=ml_repo_id, name=name, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, run_id=run_id, include_empty_models=include_empty_models, @@ -437,7 +437,7 @@ async def _get_next(): fqn=fqn, ml_repo_id=ml_repo_id, name=name, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, run_id=run_id, include_empty_models=include_empty_models, diff --git a/src/truefoundry_sdk/personal_access_tokens/raw_client.py b/src/truefoundry_sdk/personal_access_tokens/raw_client.py index 7234e8f..5d9707b 100644 --- a/src/truefoundry_sdk/personal_access_tokens/raw_client.py +++ b/src/truefoundry_sdk/personal_access_tokens/raw_client.py @@ -79,7 +79,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -382,7 +382,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) diff --git a/src/truefoundry_sdk/prompt_versions/raw_client.py b/src/truefoundry_sdk/prompt_versions/raw_client.py index 9b62c9f..41606c8 100644 --- a/src/truefoundry_sdk/prompt_versions/raw_client.py +++ b/src/truefoundry_sdk/prompt_versions/raw_client.py @@ -264,7 +264,7 @@ def list( ml_repo_id=ml_repo_id, name=name, version=version, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, request_options=request_options, ) @@ -532,7 +532,7 @@ async def _get_next(): ml_repo_id=ml_repo_id, name=name, version=version, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, request_options=request_options, ) diff --git a/src/truefoundry_sdk/prompts/raw_client.py b/src/truefoundry_sdk/prompts/raw_client.py index 1eba8eb..eabef15 100644 --- a/src/truefoundry_sdk/prompts/raw_client.py +++ b/src/truefoundry_sdk/prompts/raw_client.py @@ -185,7 +185,7 @@ def list( fqn=fqn, ml_repo_id=ml_repo_id, name=name, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_empty_prompts=include_empty_prompts, request_options=request_options, @@ -428,7 +428,7 @@ async def _get_next(): fqn=fqn, ml_repo_id=ml_repo_id, name=name, - offset=offset + len(_items), + offset=offset + len(_items or []), limit=limit, include_empty_prompts=include_empty_prompts, request_options=request_options, diff --git a/src/truefoundry_sdk/secret_groups/raw_client.py b/src/truefoundry_sdk/secret_groups/raw_client.py index 9cb9943..6b0b2b2 100644 --- a/src/truefoundry_sdk/secret_groups/raw_client.py +++ b/src/truefoundry_sdk/secret_groups/raw_client.py @@ -94,7 +94,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), fqn=fqn, search=search, request_options=request_options, @@ -578,7 +578,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), fqn=fqn, search=search, request_options=request_options, diff --git a/src/truefoundry_sdk/secrets/raw_client.py b/src/truefoundry_sdk/secrets/raw_client.py index 44d1489..57ca2f8 100644 --- a/src/truefoundry_sdk/secrets/raw_client.py +++ b/src/truefoundry_sdk/secrets/raw_client.py @@ -95,7 +95,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), secret_fqns=secret_fqns, secret_group_id=secret_group_id, with_value=with_value, @@ -336,7 +336,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), secret_fqns=secret_fqns, secret_group_id=secret_group_id, with_value=with_value, diff --git a/src/truefoundry_sdk/teams/raw_client.py b/src/truefoundry_sdk/teams/raw_client.py index a57e0b3..79b17b2 100644 --- a/src/truefoundry_sdk/teams/raw_client.py +++ b/src/truefoundry_sdk/teams/raw_client.py @@ -85,7 +85,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), type=type, request_options=request_options, ) @@ -344,7 +344,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), type=type, request_options=request_options, ) diff --git a/src/truefoundry_sdk/types/account.py b/src/truefoundry_sdk/types/account.py index 9a7f21e..977ffa0 100644 --- a/src/truefoundry_sdk/types/account.py +++ b/src/truefoundry_sdk/types/account.py @@ -13,16 +13,26 @@ class Account(UniversalBaseModel): id: typing.Optional[str] = None name: typing.Optional[str] = None - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) manifest: typing.Dict[str, typing.Any] = pydantic.Field() """ Account manifest """ - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None - is_editable: typing_extensions.Annotated[bool, FieldMetadata(alias="isEditable")] + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) + is_editable: typing_extensions.Annotated[bool, FieldMetadata(alias="isEditable")] = pydantic.Field( + alias="isEditable" + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/addon_component.py b/src/truefoundry_sdk/types/addon_component.py index 806f2c4..dbb0b9c 100644 --- a/src/truefoundry_sdk/types/addon_component.py +++ b/src/truefoundry_sdk/types/addon_component.py @@ -18,24 +18,32 @@ class AddonComponent(UniversalBaseModel): name: AddonComponentName - app_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="appName")] = None + app_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="appName")] = pydantic.Field( + alias="appName", default=None + ) namespace: typing.Optional[str] = None - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = None + application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( + pydantic.Field(alias="applicationId", default=None) + ) description: typing.Optional[str] = None path: typing.Optional[str] = None - addon_folder: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="addonFolder")] = None + addon_folder: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="addonFolder")] = ( + pydantic.Field(alias="addonFolder", default=None) + ) installed: typing.Optional[bool] = None status: typing.Optional[AddonComponentStatus] = None version: typing.Optional[str] = None manifest: typing.Optional[typing.Dict[str, typing.Any]] = None installation_source: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="installationSource") - ] = None + ] = pydantic.Field(alias="installationSource", default=None) unsupported_cluster_types: typing_extensions.Annotated[ typing.Optional[typing.List[ClusterType]], FieldMetadata(alias="unsupportedClusterTypes") - ] = None + ] = pydantic.Field(alias="unsupportedClusterTypes", default=None) required: typing.Optional[bool] = None - known_cr_ds: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="knownCRDs")] = None + known_cr_ds: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="knownCRDs")] = ( + pydantic.Field(alias="knownCRDs", default=None) + ) source: typing.Optional[AddOnComponentSource] = None upgrades: typing.Optional[UpgradeData] = None labels: typing.Optional[typing.List[str]] = None @@ -44,7 +52,9 @@ class AddonComponent(UniversalBaseModel): Recommendations """ - workspace_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceId")] = None + workspace_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceId")] = ( + pydantic.Field(alias="workspaceId", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/addon_component_status.py b/src/truefoundry_sdk/types/addon_component_status.py index dd26133..ef37f79 100644 --- a/src/truefoundry_sdk/types/addon_component_status.py +++ b/src/truefoundry_sdk/types/addon_component_status.py @@ -10,14 +10,14 @@ class AddonComponentStatus(UniversalBaseModel): health_status: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="healthStatus")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="healthStatus", default=None) ) """ Health status of the addon """ sync_status: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="syncStatus")] = pydantic.Field( - default=None + alias="syncStatus", default=None ) """ Sync status of the addon diff --git a/src/truefoundry_sdk/types/ai21provider_account.py b/src/truefoundry_sdk/types/ai21provider_account.py index 0cc3195..2ed1b09 100644 --- a/src/truefoundry_sdk/types/ai21provider_account.py +++ b/src/truefoundry_sdk/types/ai21provider_account.py @@ -38,7 +38,9 @@ class Ai21ProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/alert.py b/src/truefoundry_sdk/types/alert.py index 55ee339..86b6133 100644 --- a/src/truefoundry_sdk/types/alert.py +++ b/src/truefoundry_sdk/types/alert.py @@ -13,17 +13,29 @@ class Alert(UniversalBaseModel): id: typing.Optional[str] = None name: str timestamps: typing.List[dt.datetime] - start_time: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="startTime")] - resolved_time: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="resolvedTime")] = None - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = None - cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId")] - tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = None + start_time: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="startTime")] = pydantic.Field( + alias="startTime" + ) + resolved_time: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="resolvedTime")] = ( + pydantic.Field(alias="resolvedTime", default=None) + ) + application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( + pydantic.Field(alias="applicationId", default=None) + ) + cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId")] = pydantic.Field(alias="clusterId") + tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName", default=None + ) fingerprint: str - updated_at: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="updatedAt")] = None - created_at: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdAt")] = None + updated_at: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt", default=None + ) + created_at: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt", default=None + ) application_debug_info_id: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="applicationDebugInfoId") - ] = None + ] = pydantic.Field(alias="applicationDebugInfoId", default=None) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/anthropic_provider_account.py b/src/truefoundry_sdk/types/anthropic_provider_account.py index b23fe16..79b42e8 100644 --- a/src/truefoundry_sdk/types/anthropic_provider_account.py +++ b/src/truefoundry_sdk/types/anthropic_provider_account.py @@ -38,7 +38,9 @@ class AnthropicProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/application.py b/src/truefoundry_sdk/types/application.py index acf0a6e..b64a7ba 100644 --- a/src/truefoundry_sdk/types/application.py +++ b/src/truefoundry_sdk/types/application.py @@ -23,15 +23,31 @@ class Application(UniversalBaseModel): fqn: typing.Optional[str] = None name: typing.Optional[str] = None type: typing.Optional[ApplicationType] = None - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = None + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName", default=None + ) metadata: typing.Optional[ApplicationMetadata] = None - lifecycle_stage: typing_extensions.Annotated[ApplicationLifecycleStage, FieldMetadata(alias="lifecycleStage")] - workspace_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceId")] = None - last_version: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="lastVersion")] = None - active_version: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="activeVersion")] = None - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + lifecycle_stage: typing_extensions.Annotated[ApplicationLifecycleStage, FieldMetadata(alias="lifecycleStage")] = ( + pydantic.Field(alias="lifecycleStage") + ) + workspace_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceId")] = ( + pydantic.Field(alias="workspaceId", default=None) + ) + last_version: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="lastVersion")] = ( + pydantic.Field(alias="lastVersion", default=None) + ) + active_version: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="activeVersion")] = ( + pydantic.Field(alias="activeVersion", default=None) + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) recommendations: typing.Optional[typing.List[Recommendation]] = pydantic.Field(default=None) """ Recommendations for this application @@ -44,34 +60,38 @@ class Application(UniversalBaseModel): alerts_summary: typing_extensions.Annotated[ typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="alertsSummary") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="alertsSummary", default=None) """ Summary of alerts for this application """ application_debug_infos: typing_extensions.Annotated[ typing.Optional[typing.List["ApplicationDebugInfo"]], FieldMetadata(alias="applicationDebugInfos") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="applicationDebugInfos", default=None) """ Debug infos for this application """ potential_problems: typing_extensions.Annotated[ typing.Optional[typing.List[ApplicationProblem]], FieldMetadata(alias="potentialProblems") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="potentialProblems", default=None) """ Potential problems with the application """ autopilot: typing.Dict[str, typing.Any] - workspace_fqn: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceFqn")] = None - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + workspace_fqn: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceFqn")] = ( + pydantic.Field(alias="workspaceFqn", default=None) + ) + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) deployment: typing.Optional["Deployment"] = None active_deployment_id: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="activeDeploymentId") - ] = None + ] = pydantic.Field(alias="activeDeploymentId", default=None) last_deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="lastDeploymentId")] = ( - None + pydantic.Field(alias="lastDeploymentId", default=None) ) if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/application_debug_info.py b/src/truefoundry_sdk/types/application_debug_info.py index 5a208c9..a06d81d 100644 --- a/src/truefoundry_sdk/types/application_debug_info.py +++ b/src/truefoundry_sdk/types/application_debug_info.py @@ -13,11 +13,19 @@ class ApplicationDebugInfo(UniversalBaseModel): id: typing.Optional[str] = None - application_id: typing_extensions.Annotated[str, FieldMetadata(alias="applicationId")] + application_id: typing_extensions.Annotated[str, FieldMetadata(alias="applicationId")] = pydantic.Field( + alias="applicationId" + ) application: typing.Optional["Application"] = None - debug_info: typing_extensions.Annotated[typing.Dict[str, typing.Any], FieldMetadata(alias="debugInfo")] - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + debug_info: typing_extensions.Annotated[typing.Dict[str, typing.Any], FieldMetadata(alias="debugInfo")] = ( + pydantic.Field(alias="debugInfo") + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/aws_bedrock_provider_account.py b/src/truefoundry_sdk/types/aws_bedrock_provider_account.py index 2ef47f2..d2184af 100644 --- a/src/truefoundry_sdk/types/aws_bedrock_provider_account.py +++ b/src/truefoundry_sdk/types/aws_bedrock_provider_account.py @@ -44,7 +44,9 @@ class AwsBedrockProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/aws_provider_account.py b/src/truefoundry_sdk/types/aws_provider_account.py index 560da10..49bcd4b 100644 --- a/src/truefoundry_sdk/types/aws_provider_account.py +++ b/src/truefoundry_sdk/types/aws_provider_account.py @@ -41,7 +41,9 @@ class AwsProviderAccount(UniversalBaseModel): List of integrations that are associated with the AWS provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py b/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py index 4932841..fd330ec 100644 --- a/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py +++ b/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py @@ -44,7 +44,9 @@ class AwsSagemakerProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/azure_foundry_provider_account.py b/src/truefoundry_sdk/types/azure_foundry_provider_account.py index 03b92ab..1d31e5f 100644 --- a/src/truefoundry_sdk/types/azure_foundry_provider_account.py +++ b/src/truefoundry_sdk/types/azure_foundry_provider_account.py @@ -36,7 +36,9 @@ class AzureFoundryProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/azure_open_ai_provider_account.py b/src/truefoundry_sdk/types/azure_open_ai_provider_account.py index 30e9b37..98ce45b 100644 --- a/src/truefoundry_sdk/types/azure_open_ai_provider_account.py +++ b/src/truefoundry_sdk/types/azure_open_ai_provider_account.py @@ -43,7 +43,9 @@ class AzureOpenAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/azure_provider_account.py b/src/truefoundry_sdk/types/azure_provider_account.py index 23ae16b..2838290 100644 --- a/src/truefoundry_sdk/types/azure_provider_account.py +++ b/src/truefoundry_sdk/types/azure_provider_account.py @@ -35,7 +35,9 @@ class AzureProviderAccount(UniversalBaseModel): List of integrations that are associated with the Azure provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/bitbucket_provider_account.py b/src/truefoundry_sdk/types/bitbucket_provider_account.py index fa2f674..3bf62bc 100644 --- a/src/truefoundry_sdk/types/bitbucket_provider_account.py +++ b/src/truefoundry_sdk/types/bitbucket_provider_account.py @@ -30,7 +30,9 @@ class BitbucketProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cerebras_provider_account.py b/src/truefoundry_sdk/types/cerebras_provider_account.py index ce0d206..abae3cd 100644 --- a/src/truefoundry_sdk/types/cerebras_provider_account.py +++ b/src/truefoundry_sdk/types/cerebras_provider_account.py @@ -38,7 +38,9 @@ class CerebrasProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cloudera_provider_account.py b/src/truefoundry_sdk/types/cloudera_provider_account.py index 9ea03d8..740b53b 100644 --- a/src/truefoundry_sdk/types/cloudera_provider_account.py +++ b/src/truefoundry_sdk/types/cloudera_provider_account.py @@ -42,7 +42,9 @@ class ClouderaProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cluster.py b/src/truefoundry_sdk/types/cluster.py index ff87794..2485466 100644 --- a/src/truefoundry_sdk/types/cluster.py +++ b/src/truefoundry_sdk/types/cluster.py @@ -16,14 +16,24 @@ class Cluster(UniversalBaseModel): fqn: str name: str manifest: ClusterManifest - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] - account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = None + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) + account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = pydantic.Field( + alias="accountId", default=None + ) created_by_subject: typing_extensions.Annotated[ typing.Optional[Subject], FieldMetadata(alias="createdBySubject") - ] = None - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + ] = pydantic.Field(alias="createdBySubject", default=None) + created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt" + ) + updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt" + ) + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cluster_gateway.py b/src/truefoundry_sdk/types/cluster_gateway.py index 8463245..34fa681 100644 --- a/src/truefoundry_sdk/types/cluster_gateway.py +++ b/src/truefoundry_sdk/types/cluster_gateway.py @@ -13,7 +13,7 @@ class ClusterGateway(UniversalBaseModel): name: str hosts: typing.List[str] is_tie_breaker: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isTieBreaker")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="isTieBreaker", default=None) ) """ Used when there are 2 gateways with same host diff --git a/src/truefoundry_sdk/types/cluster_manifest.py b/src/truefoundry_sdk/types/cluster_manifest.py index 7ce604a..b85d96d 100644 --- a/src/truefoundry_sdk/types/cluster_manifest.py +++ b/src/truefoundry_sdk/types/cluster_manifest.py @@ -89,7 +89,9 @@ class ClusterManifest(UniversalBaseModel): Collaborators who can access this cluster """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cohere_provider_account.py b/src/truefoundry_sdk/types/cohere_provider_account.py index 3c85b01..fd51ceb 100644 --- a/src/truefoundry_sdk/types/cohere_provider_account.py +++ b/src/truefoundry_sdk/types/cohere_provider_account.py @@ -38,7 +38,9 @@ class CohereProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/custom_provider_account.py b/src/truefoundry_sdk/types/custom_provider_account.py index 019b806..70c8f88 100644 --- a/src/truefoundry_sdk/types/custom_provider_account.py +++ b/src/truefoundry_sdk/types/custom_provider_account.py @@ -32,7 +32,9 @@ class CustomProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/databricks_provider_account.py b/src/truefoundry_sdk/types/databricks_provider_account.py index 8ec06bc..3936010 100644 --- a/src/truefoundry_sdk/types/databricks_provider_account.py +++ b/src/truefoundry_sdk/types/databricks_provider_account.py @@ -47,7 +47,9 @@ class DatabricksProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deepinfra_provider_account.py b/src/truefoundry_sdk/types/deepinfra_provider_account.py index a87980c..6d07200 100644 --- a/src/truefoundry_sdk/types/deepinfra_provider_account.py +++ b/src/truefoundry_sdk/types/deepinfra_provider_account.py @@ -38,7 +38,9 @@ class DeepinfraProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deployment.py b/src/truefoundry_sdk/types/deployment.py index a4abf40..15d2052 100644 --- a/src/truefoundry_sdk/types/deployment.py +++ b/src/truefoundry_sdk/types/deployment.py @@ -20,30 +20,42 @@ class Deployment(UniversalBaseModel): id: typing.Optional[str] = None version: typing.Optional[float] = None fqn: typing.Optional[str] = None - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = None + application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( + pydantic.Field(alias="applicationId", default=None) + ) manifest: DeploymentManifest application: typing.Optional["Application"] = None - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) deployment_builds: typing_extensions.Annotated[ typing.Optional[typing.List[BuildInfo]], FieldMetadata(alias="deploymentBuilds") - ] = None + ] = pydantic.Field(alias="deploymentBuilds", default=None) deployment_statuses: typing_extensions.Annotated[ typing.Optional[typing.List[DeploymentStatus]], FieldMetadata(alias="deploymentStatuses") - ] = None - current_status_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="currentStatusId")] = None + ] = pydantic.Field(alias="deploymentStatuses", default=None) + current_status_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="currentStatusId")] = ( + pydantic.Field(alias="currentStatusId", default=None) + ) current_status: typing_extensions.Annotated[ typing.Optional[DeploymentStatus], FieldMetadata(alias="currentStatus") - ] = None + ] = pydantic.Field(alias="currentStatus", default=None) applied_recommendations: typing_extensions.Annotated[ typing.Optional[typing.List[Recommendation]], FieldMetadata(alias="appliedRecommendations") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="appliedRecommendations", default=None) """ Applied recommendations for this deployment """ - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deployment_build.py b/src/truefoundry_sdk/types/deployment_build.py index e83ecce..8ee5600 100644 --- a/src/truefoundry_sdk/types/deployment_build.py +++ b/src/truefoundry_sdk/types/deployment_build.py @@ -13,19 +13,37 @@ class DeploymentBuild(UniversalBaseModel): id: typing.Optional[str] = None - deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = None - component_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="componentName")] = None + deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = ( + pydantic.Field(alias="deploymentId", default=None) + ) + component_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="componentName")] = ( + pydantic.Field(alias="componentName", default=None) + ) build: typing.Optional[BuildInfo] = None - build_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="buildId")] = None - image_uri: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="imageUri")] = None + build_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="buildId")] = pydantic.Field( + alias="buildId", default=None + ) + image_uri: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="imageUri")] = pydantic.Field( + alias="imageUri", default=None + ) name: typing.Optional[str] = None status: typing.Optional[BuildStatus] = None - get_logs_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="getLogsUrl")] = None - tail_logs_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tailLogsUrl")] = None - logs_start_ts: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="logsStartTs")] = None + get_logs_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="getLogsUrl")] = pydantic.Field( + alias="getLogsUrl", default=None + ) + tail_logs_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tailLogsUrl")] = ( + pydantic.Field(alias="tailLogsUrl", default=None) + ) + logs_start_ts: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="logsStartTs")] = ( + pydantic.Field(alias="logsStartTs", default=None) + ) metadata: typing.Optional[typing.Dict[str, typing.Any]] = None - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deployment_status.py b/src/truefoundry_sdk/types/deployment_status.py index e48f00b..c06fe00 100644 --- a/src/truefoundry_sdk/types/deployment_status.py +++ b/src/truefoundry_sdk/types/deployment_status.py @@ -13,14 +13,22 @@ class DeploymentStatus(UniversalBaseModel): id: typing.Optional[str] = None - deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = None + deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = ( + pydantic.Field(alias="deploymentId", default=None) + ) status: typing.Optional[DeploymentStatusValue] = None state: typing.Optional[typing.Dict[str, typing.Any]] = None transition: typing.Optional[DeploymentTransition] = None message: typing.Optional[str] = None - retry_count: typing_extensions.Annotated[typing.Optional[float], FieldMetadata(alias="retryCount")] = None - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + retry_count: typing_extensions.Annotated[typing.Optional[float], FieldMetadata(alias="retryCount")] = ( + pydantic.Field(alias="retryCount", default=None) + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/dockerhub_provider_account.py b/src/truefoundry_sdk/types/dockerhub_provider_account.py index ace85df..ee29239 100644 --- a/src/truefoundry_sdk/types/dockerhub_provider_account.py +++ b/src/truefoundry_sdk/types/dockerhub_provider_account.py @@ -37,7 +37,9 @@ class DockerhubProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/environment.py b/src/truefoundry_sdk/types/environment.py index fc651ee..2a4c5a6 100644 --- a/src/truefoundry_sdk/types/environment.py +++ b/src/truefoundry_sdk/types/environment.py @@ -17,14 +17,22 @@ class Environment(UniversalBaseModel): name: str priority: float color: EnvironmentColor - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - is_production: typing_extensions.Annotated[bool, FieldMetadata(alias="isProduction")] + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + is_production: typing_extensions.Annotated[bool, FieldMetadata(alias="isProduction")] = pydantic.Field( + alias="isProduction" + ) optimize_for: typing_extensions.Annotated[ typing.Optional[EnvironmentOptimizeFor], FieldMetadata(alias="optimizeFor") - ] = None + ] = pydantic.Field(alias="optimizeFor", default=None) manifest: EnvironmentManifest - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/environment_color.py b/src/truefoundry_sdk/types/environment_color.py index 988a1f8..04de9f5 100644 --- a/src/truefoundry_sdk/types/environment_color.py +++ b/src/truefoundry_sdk/types/environment_color.py @@ -9,12 +9,16 @@ class EnvironmentColor(UniversalBaseModel): - color_hex: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="colorHex")] = None + color_hex: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="colorHex")] = pydantic.Field( + alias="colorHex", default=None + ) background_color_hex: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="backgroundColorHex") - ] = None + ] = pydantic.Field(alias="backgroundColorHex", default=None) color: typing.Optional[str] = None - background_color: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="backgroundColor")] = None + background_color: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="backgroundColor")] = ( + pydantic.Field(alias="backgroundColor", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/environment_manifest.py b/src/truefoundry_sdk/types/environment_manifest.py index 264825c..29965c6 100644 --- a/src/truefoundry_sdk/types/environment_manifest.py +++ b/src/truefoundry_sdk/types/environment_manifest.py @@ -22,12 +22,16 @@ class EnvironmentManifest(UniversalBaseModel): """ color: EnvironmentColor - is_production: typing_extensions.Annotated[bool, FieldMetadata(alias="isProduction")] = pydantic.Field() + is_production: typing_extensions.Annotated[bool, FieldMetadata(alias="isProduction")] = pydantic.Field( + alias="isProduction" + ) """ Environment Type - Indicates if the environment is for production use """ - optimize_for: typing_extensions.Annotated[EnvironmentOptimizeFor, FieldMetadata(alias="optimizeFor")] + optimize_for: typing_extensions.Annotated[EnvironmentOptimizeFor, FieldMetadata(alias="optimizeFor")] = ( + pydantic.Field(alias="optimizeFor") + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/event.py b/src/truefoundry_sdk/types/event.py index c618662..675ae1a 100644 --- a/src/truefoundry_sdk/types/event.py +++ b/src/truefoundry_sdk/types/event.py @@ -17,19 +17,21 @@ class Event(UniversalBaseModel): """ first_timestamp: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="firstTimestamp")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="firstTimestamp", default=None) ) """ Timestamp when the event was first observed """ - last_timestamp: typing_extensions.Annotated[str, FieldMetadata(alias="lastTimestamp")] = pydantic.Field() + last_timestamp: typing_extensions.Annotated[str, FieldMetadata(alias="lastTimestamp")] = pydantic.Field( + alias="lastTimestamp" + ) """ Timestamp when the event was last observed """ involved_object: typing_extensions.Annotated[EventInvolvedObject, FieldMetadata(alias="involvedObject")] = ( - pydantic.Field() + pydantic.Field(alias="involvedObject") ) """ Details of the involved object diff --git a/src/truefoundry_sdk/types/event_involved_object.py b/src/truefoundry_sdk/types/event_involved_object.py index f26d7e2..fdf0f1e 100644 --- a/src/truefoundry_sdk/types/event_involved_object.py +++ b/src/truefoundry_sdk/types/event_involved_object.py @@ -11,9 +11,13 @@ class EventInvolvedObject(UniversalBaseModel): kind: str name: str - api_version: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="apiVersion")] = None + api_version: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="apiVersion")] = pydantic.Field( + alias="apiVersion", default=None + ) namespace: typing.Optional[str] = None - container_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="containerName")] = None + container_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="containerName")] = ( + pydantic.Field(alias="containerName", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/flyte_launch_plan_id.py b/src/truefoundry_sdk/types/flyte_launch_plan_id.py index bfc7f53..45cdd4a 100644 --- a/src/truefoundry_sdk/types/flyte_launch_plan_id.py +++ b/src/truefoundry_sdk/types/flyte_launch_plan_id.py @@ -10,7 +10,7 @@ class FlyteLaunchPlanId(UniversalBaseModel): resource_type: typing_extensions.Annotated[typing.Literal["LAUNCH_PLAN"], FieldMetadata(alias="resourceType")] = ( - "LAUNCH_PLAN" + pydantic.Field(alias="resourceType", default="LAUNCH_PLAN") ) name: str diff --git a/src/truefoundry_sdk/types/flyte_launch_plan_spec.py b/src/truefoundry_sdk/types/flyte_launch_plan_spec.py index f6c672b..0137d92 100644 --- a/src/truefoundry_sdk/types/flyte_launch_plan_spec.py +++ b/src/truefoundry_sdk/types/flyte_launch_plan_spec.py @@ -10,7 +10,9 @@ class FlyteLaunchPlanSpec(UniversalBaseModel): - workflow_id: typing_extensions.Annotated[FlyteWorkflowId, FieldMetadata(alias="workflowId")] + workflow_id: typing_extensions.Annotated[FlyteWorkflowId, FieldMetadata(alias="workflowId")] = pydantic.Field( + alias="workflowId" + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/flyte_task_id.py b/src/truefoundry_sdk/types/flyte_task_id.py index f31eb85..48526eb 100644 --- a/src/truefoundry_sdk/types/flyte_task_id.py +++ b/src/truefoundry_sdk/types/flyte_task_id.py @@ -9,7 +9,9 @@ class FlyteTaskId(UniversalBaseModel): - resource_type: typing_extensions.Annotated[typing.Literal["TASK"], FieldMetadata(alias="resourceType")] = "TASK" + resource_type: typing_extensions.Annotated[typing.Literal["TASK"], FieldMetadata(alias="resourceType")] = ( + pydantic.Field(alias="resourceType", default="TASK") + ) name: str if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/flyte_workflow_id.py b/src/truefoundry_sdk/types/flyte_workflow_id.py index 757763e..73aaeeb 100644 --- a/src/truefoundry_sdk/types/flyte_workflow_id.py +++ b/src/truefoundry_sdk/types/flyte_workflow_id.py @@ -10,7 +10,7 @@ class FlyteWorkflowId(UniversalBaseModel): resource_type: typing_extensions.Annotated[typing.Literal["WORKFLOW"], FieldMetadata(alias="resourceType")] = ( - "WORKFLOW" + pydantic.Field(alias="resourceType", default="WORKFLOW") ) name: str diff --git a/src/truefoundry_sdk/types/gateway_configuration.py b/src/truefoundry_sdk/types/gateway_configuration.py index 8f9a828..c97385e 100644 --- a/src/truefoundry_sdk/types/gateway_configuration.py +++ b/src/truefoundry_sdk/types/gateway_configuration.py @@ -13,12 +13,20 @@ class GatewayConfiguration(UniversalBaseModel): id: typing.Optional[str] = None - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) type: str manifest: types_config_Config - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/gateway_request_metadata_filter.py b/src/truefoundry_sdk/types/gateway_request_metadata_filter.py index 688bd2b..4d6adbf 100644 --- a/src/truefoundry_sdk/types/gateway_request_metadata_filter.py +++ b/src/truefoundry_sdk/types/gateway_request_metadata_filter.py @@ -11,7 +11,9 @@ class GatewayRequestMetadataFilter(UniversalBaseModel): - gateway_request_metadata_key: typing_extensions.Annotated[str, FieldMetadata(alias="gatewayRequestMetadataKey")] + gateway_request_metadata_key: typing_extensions.Annotated[str, FieldMetadata(alias="gatewayRequestMetadataKey")] = ( + pydantic.Field(alias="gatewayRequestMetadataKey") + ) operator: GatewayRequestMetadataFilterOperator value: GatewayRequestMetadataFilterValue diff --git a/src/truefoundry_sdk/types/gcp_api_key_auth.py b/src/truefoundry_sdk/types/gcp_api_key_auth.py index 0faf334..3df7039 100644 --- a/src/truefoundry_sdk/types/gcp_api_key_auth.py +++ b/src/truefoundry_sdk/types/gcp_api_key_auth.py @@ -18,7 +18,7 @@ class GcpApiKeyAuth(UniversalBaseModel): +value=api-key """ - api_key: typing_extensions.Annotated[str, FieldMetadata(alias="apiKey")] = pydantic.Field() + api_key: typing_extensions.Annotated[str, FieldMetadata(alias="apiKey")] = pydantic.Field(alias="apiKey") """ The API key for Google Cloud authentication """ diff --git a/src/truefoundry_sdk/types/gcp_provider_account.py b/src/truefoundry_sdk/types/gcp_provider_account.py index d4af605..4774f6e 100644 --- a/src/truefoundry_sdk/types/gcp_provider_account.py +++ b/src/truefoundry_sdk/types/gcp_provider_account.py @@ -37,7 +37,9 @@ class GcpProviderAccount(UniversalBaseModel): List of integrations that are associated with the GCP provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py b/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py index 5283872..1f1e47b 100644 --- a/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py +++ b/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py @@ -9,7 +9,9 @@ class GetAuthenticatedVcsurlResponse(UniversalBaseModel): - authenticated_url: typing_extensions.Annotated[str, FieldMetadata(alias="authenticatedURL")] = pydantic.Field() + authenticated_url: typing_extensions.Annotated[str, FieldMetadata(alias="authenticatedURL")] = pydantic.Field( + alias="authenticatedURL" + ) """ Authenticated URL to access the repository """ diff --git a/src/truefoundry_sdk/types/github_provider_account.py b/src/truefoundry_sdk/types/github_provider_account.py index 1a53067..6bf4bef 100644 --- a/src/truefoundry_sdk/types/github_provider_account.py +++ b/src/truefoundry_sdk/types/github_provider_account.py @@ -30,7 +30,9 @@ class GithubProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/gitlab_provider_account.py b/src/truefoundry_sdk/types/gitlab_provider_account.py index 5eed8dc..b007da8 100644 --- a/src/truefoundry_sdk/types/gitlab_provider_account.py +++ b/src/truefoundry_sdk/types/gitlab_provider_account.py @@ -30,7 +30,9 @@ class GitlabProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/google_gemini_provider_account.py b/src/truefoundry_sdk/types/google_gemini_provider_account.py index 467ca54..04f9956 100644 --- a/src/truefoundry_sdk/types/google_gemini_provider_account.py +++ b/src/truefoundry_sdk/types/google_gemini_provider_account.py @@ -38,7 +38,9 @@ class GoogleGeminiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/google_vertex_provider_account.py b/src/truefoundry_sdk/types/google_vertex_provider_account.py index 53a0ef9..f23b650 100644 --- a/src/truefoundry_sdk/types/google_vertex_provider_account.py +++ b/src/truefoundry_sdk/types/google_vertex_provider_account.py @@ -45,7 +45,9 @@ class GoogleVertexProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/graph.py b/src/truefoundry_sdk/types/graph.py index 4e1e7d9..f6f4e0d 100644 --- a/src/truefoundry_sdk/types/graph.py +++ b/src/truefoundry_sdk/types/graph.py @@ -25,7 +25,9 @@ class Graph(UniversalBaseModel): Chart name """ - chart_type: typing_extensions.Annotated[GraphChartType, FieldMetadata(alias="chartType")] = pydantic.Field() + chart_type: typing_extensions.Annotated[GraphChartType, FieldMetadata(alias="chartType")] = pydantic.Field( + alias="chartType" + ) """ Chart type """ diff --git a/src/truefoundry_sdk/types/groq_provider_account.py b/src/truefoundry_sdk/types/groq_provider_account.py index 7694952..88c726a 100644 --- a/src/truefoundry_sdk/types/groq_provider_account.py +++ b/src/truefoundry_sdk/types/groq_provider_account.py @@ -38,7 +38,9 @@ class GroqProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/guardrail_config_group.py b/src/truefoundry_sdk/types/guardrail_config_group.py index 3ae9afe..0c8083d 100644 --- a/src/truefoundry_sdk/types/guardrail_config_group.py +++ b/src/truefoundry_sdk/types/guardrail_config_group.py @@ -39,7 +39,9 @@ class GuardrailConfigGroup(UniversalBaseModel): List of Guardrail Configs, which are part of this Guardrail Config Group. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/hashicorp_provider_account.py b/src/truefoundry_sdk/types/hashicorp_provider_account.py index 29b98a7..106495b 100644 --- a/src/truefoundry_sdk/types/hashicorp_provider_account.py +++ b/src/truefoundry_sdk/types/hashicorp_provider_account.py @@ -30,7 +30,9 @@ class HashicorpProviderAccount(UniversalBaseModel): List of integrations that are associated with the HashiCorp Vault provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/helm.py b/src/truefoundry_sdk/types/helm.py index 3b91cec..b4b1180 100644 --- a/src/truefoundry_sdk/types/helm.py +++ b/src/truefoundry_sdk/types/helm.py @@ -39,7 +39,7 @@ class Helm(UniversalBaseModel): kustomize: typing.Optional[Kustomize] = None ignore_differences: typing_extensions.Annotated[ typing.Optional[typing.List[typing.Dict[str, typing.Any]]], FieldMetadata(alias="ignoreDifferences") - ] = None + ] = pydantic.Field(alias="ignoreDifferences", default=None) workspace_fqn: typing.Optional[str] = pydantic.Field(default=None) """ Fully qualified name of the workspace diff --git a/src/truefoundry_sdk/types/http_error.py b/src/truefoundry_sdk/types/http_error.py index be737b8..ab62b04 100644 --- a/src/truefoundry_sdk/types/http_error.py +++ b/src/truefoundry_sdk/types/http_error.py @@ -10,7 +10,9 @@ class HttpError(UniversalBaseModel): - status_code: typing_extensions.Annotated[int, FieldMetadata(alias="statusCode")] = pydantic.Field() + status_code: typing_extensions.Annotated[int, FieldMetadata(alias="statusCode")] = pydantic.Field( + alias="statusCode" + ) """ HTTP Status Code """ diff --git a/src/truefoundry_sdk/types/i_change.py b/src/truefoundry_sdk/types/i_change.py index b33918f..f65921f 100644 --- a/src/truefoundry_sdk/types/i_change.py +++ b/src/truefoundry_sdk/types/i_change.py @@ -17,7 +17,7 @@ class IChange(UniversalBaseModel): value: typing.Optional[typing.Dict[str, typing.Any]] = None old_value: typing_extensions.Annotated[ typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="oldValue") - ] = None + ] = pydantic.Field(alias="oldValue", default=None) changes: typing.Optional[typing.List["IChange"]] = None if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/is_cluster_connected_response.py b/src/truefoundry_sdk/types/is_cluster_connected_response.py index 9c8710f..965b09b 100644 --- a/src/truefoundry_sdk/types/is_cluster_connected_response.py +++ b/src/truefoundry_sdk/types/is_cluster_connected_response.py @@ -9,7 +9,9 @@ class IsClusterConnectedResponse(UniversalBaseModel): - is_connected: typing_extensions.Annotated[bool, FieldMetadata(alias="isConnected")] = pydantic.Field() + is_connected: typing_extensions.Annotated[bool, FieldMetadata(alias="isConnected")] = pydantic.Field( + alias="isConnected" + ) """ Whether the cluster is connected """ diff --git a/src/truefoundry_sdk/types/jfrog_provider_account.py b/src/truefoundry_sdk/types/jfrog_provider_account.py index 17bec8f..81a76b9 100644 --- a/src/truefoundry_sdk/types/jfrog_provider_account.py +++ b/src/truefoundry_sdk/types/jfrog_provider_account.py @@ -37,7 +37,9 @@ class JfrogProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/job_run.py b/src/truefoundry_sdk/types/job_run.py index a25af96..1dfc04a 100644 --- a/src/truefoundry_sdk/types/job_run.py +++ b/src/truefoundry_sdk/types/job_run.py @@ -16,23 +16,27 @@ class JobRun(UniversalBaseModel): JobRun Name """ - application_name: typing_extensions.Annotated[str, FieldMetadata(alias="applicationName")] = pydantic.Field() + application_name: typing_extensions.Annotated[str, FieldMetadata(alias="applicationName")] = pydantic.Field( + alias="applicationName" + ) """ Application Name """ - deployment_version: typing_extensions.Annotated[str, FieldMetadata(alias="deploymentVersion")] = pydantic.Field() + deployment_version: typing_extensions.Annotated[str, FieldMetadata(alias="deploymentVersion")] = pydantic.Field( + alias="deploymentVersion" + ) """ Deployment Version """ - created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt")] = pydantic.Field() + created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt")] = pydantic.Field(alias="createdAt") """ Created At """ end_time: typing_extensions.Annotated[typing.Optional[float], FieldMetadata(alias="endTime")] = pydantic.Field( - default=None + alias="endTime", default=None ) """ End Time of JobRun @@ -48,7 +52,9 @@ class JobRun(UniversalBaseModel): Command """ - total_retries: typing_extensions.Annotated[int, FieldMetadata(alias="totalRetries")] = pydantic.Field() + total_retries: typing_extensions.Annotated[int, FieldMetadata(alias="totalRetries")] = pydantic.Field( + alias="totalRetries" + ) """ Total Retries """ @@ -64,7 +70,7 @@ class JobRun(UniversalBaseModel): """ triggered_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="triggeredBy")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="triggeredBy", default=None) ) """ Triggered By @@ -72,20 +78,20 @@ class JobRun(UniversalBaseModel): triggered_by_subject: typing_extensions.Annotated[ typing.Optional[Subject], FieldMetadata(alias="triggeredBySubject") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="triggeredBySubject", default=None) """ Triggered By Subject """ exit_code: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="exitCode")] = pydantic.Field( - default=None + alias="exitCode", default=None ) """ Exit Code """ spark_ui: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="sparkUi")] = pydantic.Field( - default=None + alias="sparkUi", default=None ) """ Spark UI Url diff --git a/src/truefoundry_sdk/types/json_schema.py b/src/truefoundry_sdk/types/json_schema.py index 4ec32e4..5c6fce3 100644 --- a/src/truefoundry_sdk/types/json_schema.py +++ b/src/truefoundry_sdk/types/json_schema.py @@ -18,7 +18,9 @@ class JsonSchema(UniversalBaseModel): Name of the schema """ - schema_: typing_extensions.Annotated[typing.Dict[str, typing.Any], FieldMetadata(alias="schema")] = pydantic.Field() + schema_: typing_extensions.Annotated[typing.Dict[str, typing.Any], FieldMetadata(alias="schema")] = pydantic.Field( + alias="schema" + ) """ JSON schema object defining the expected structure """ diff --git a/src/truefoundry_sdk/types/jwt.py b/src/truefoundry_sdk/types/jwt.py index 437f3b7..9074fb3 100644 --- a/src/truefoundry_sdk/types/jwt.py +++ b/src/truefoundry_sdk/types/jwt.py @@ -11,12 +11,18 @@ class Jwt(UniversalBaseModel): id: str - subject_type: typing_extensions.Annotated[str, FieldMetadata(alias="subjectType")] - subject_id: typing_extensions.Annotated[str, FieldMetadata(alias="subjectId")] + subject_type: typing_extensions.Annotated[str, FieldMetadata(alias="subjectType")] = pydantic.Field( + alias="subjectType" + ) + subject_id: typing_extensions.Annotated[str, FieldMetadata(alias="subjectId")] = pydantic.Field(alias="subjectId") metadata: typing.Optional[typing.Dict[str, typing.Any]] = None expiry: dt.datetime - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] + created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt" + ) + updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt" + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_files_request.py b/src/truefoundry_sdk/types/list_files_request.py index 9ebbc27..6eb7e4a 100644 --- a/src/truefoundry_sdk/types/list_files_request.py +++ b/src/truefoundry_sdk/types/list_files_request.py @@ -12,7 +12,9 @@ class ListFilesRequest(UniversalBaseModel): id: str path: typing.Optional[str] = None limit: typing.Optional[int] = None - page_token: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="pageToken")] = None + page_token: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="pageToken")] = pydantic.Field( + alias="pageToken", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/log.py b/src/truefoundry_sdk/types/log.py index f1e10fb..6e4cca7 100644 --- a/src/truefoundry_sdk/types/log.py +++ b/src/truefoundry_sdk/types/log.py @@ -30,7 +30,7 @@ class Log(UniversalBaseModel): """ container_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="containerName")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="containerName", default=None) ) """ Container Name diff --git a/src/truefoundry_sdk/types/logs_filter_query.py b/src/truefoundry_sdk/types/logs_filter_query.py index c9075fc..2e60bb2 100644 --- a/src/truefoundry_sdk/types/logs_filter_query.py +++ b/src/truefoundry_sdk/types/logs_filter_query.py @@ -11,7 +11,9 @@ class LogsFilterQuery(UniversalBaseModel): - match_string: typing_extensions.Annotated[str, FieldMetadata(alias="matchString")] = pydantic.Field() + match_string: typing_extensions.Annotated[str, FieldMetadata(alias="matchString")] = pydantic.Field( + alias="matchString" + ) """ String that needs to be matched """ diff --git a/src/truefoundry_sdk/types/mcp_server_provider_account.py b/src/truefoundry_sdk/types/mcp_server_provider_account.py index 082f9c0..1fe9283 100644 --- a/src/truefoundry_sdk/types/mcp_server_provider_account.py +++ b/src/truefoundry_sdk/types/mcp_server_provider_account.py @@ -38,7 +38,9 @@ class McpServerProviderAccount(UniversalBaseModel): List of MCP Servers, which are part of this MCP Server Group. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/mistral_ai_provider_account.py b/src/truefoundry_sdk/types/mistral_ai_provider_account.py index e972dab..d1c6040 100644 --- a/src/truefoundry_sdk/types/mistral_ai_provider_account.py +++ b/src/truefoundry_sdk/types/mistral_ai_provider_account.py @@ -38,7 +38,9 @@ class MistralAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/ml_repo_manifest.py b/src/truefoundry_sdk/types/ml_repo_manifest.py index 910a3f0..d683374 100644 --- a/src/truefoundry_sdk/types/ml_repo_manifest.py +++ b/src/truefoundry_sdk/types/ml_repo_manifest.py @@ -36,7 +36,9 @@ class MlRepoManifest(UniversalBaseModel): Users and Teams that have access to MLRepo """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/multi_part_upload.py b/src/truefoundry_sdk/types/multi_part_upload.py index 954c088..3cb7e55 100644 --- a/src/truefoundry_sdk/types/multi_part_upload.py +++ b/src/truefoundry_sdk/types/multi_part_upload.py @@ -15,7 +15,7 @@ class MultiPartUpload(UniversalBaseModel): part_signed_urls: typing.List[SignedUrl] s3compatible_upload_id: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="s3_compatible_upload_id") - ] = None + ] = pydantic.Field(alias="s3_compatible_upload_id", default=None) azure_blob_block_ids: typing.Optional[typing.List[str]] = None finalize_signed_url: SignedUrl diff --git a/src/truefoundry_sdk/types/nomic_provider_account.py b/src/truefoundry_sdk/types/nomic_provider_account.py index 65cba4d..13f7a77 100644 --- a/src/truefoundry_sdk/types/nomic_provider_account.py +++ b/src/truefoundry_sdk/types/nomic_provider_account.py @@ -38,7 +38,9 @@ class NomicProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/ollama_provider_account.py b/src/truefoundry_sdk/types/ollama_provider_account.py index 30946b0..7e36a56 100644 --- a/src/truefoundry_sdk/types/ollama_provider_account.py +++ b/src/truefoundry_sdk/types/ollama_provider_account.py @@ -38,7 +38,9 @@ class OllamaProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/open_router_provider_account.py b/src/truefoundry_sdk/types/open_router_provider_account.py index b3c0839..58ada1c 100644 --- a/src/truefoundry_sdk/types/open_router_provider_account.py +++ b/src/truefoundry_sdk/types/open_router_provider_account.py @@ -38,7 +38,9 @@ class OpenRouterProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/openai_provider_account.py b/src/truefoundry_sdk/types/openai_provider_account.py index 4c47181..2da6abe 100644 --- a/src/truefoundry_sdk/types/openai_provider_account.py +++ b/src/truefoundry_sdk/types/openai_provider_account.py @@ -43,7 +43,9 @@ class OpenaiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/pager_duty_provider_account.py b/src/truefoundry_sdk/types/pager_duty_provider_account.py index ac9fbe5..9e4c54a 100644 --- a/src/truefoundry_sdk/types/pager_duty_provider_account.py +++ b/src/truefoundry_sdk/types/pager_duty_provider_account.py @@ -30,7 +30,9 @@ class PagerDutyProviderAccount(UniversalBaseModel): List of integrations that are associated with the PagerDuty provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/palm_provider_account.py b/src/truefoundry_sdk/types/palm_provider_account.py index 1e44a2d..8cb316a 100644 --- a/src/truefoundry_sdk/types/palm_provider_account.py +++ b/src/truefoundry_sdk/types/palm_provider_account.py @@ -38,7 +38,9 @@ class PalmProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/perplexity_ai_provider_account.py b/src/truefoundry_sdk/types/perplexity_ai_provider_account.py index 17bfdc8..648745a 100644 --- a/src/truefoundry_sdk/types/perplexity_ai_provider_account.py +++ b/src/truefoundry_sdk/types/perplexity_ai_provider_account.py @@ -38,7 +38,9 @@ class PerplexityAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/personal_access_token_manifest.py b/src/truefoundry_sdk/types/personal_access_token_manifest.py index 08404df..071630e 100644 --- a/src/truefoundry_sdk/types/personal_access_token_manifest.py +++ b/src/truefoundry_sdk/types/personal_access_token_manifest.py @@ -30,7 +30,9 @@ class PersonalAccessTokenManifest(UniversalBaseModel): The fully qualified name of the user """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/prometheus_alert_rule.py b/src/truefoundry_sdk/types/prometheus_alert_rule.py index 749c800..f9d47e2 100644 --- a/src/truefoundry_sdk/types/prometheus_alert_rule.py +++ b/src/truefoundry_sdk/types/prometheus_alert_rule.py @@ -29,7 +29,7 @@ class PrometheusAlertRule(UniversalBaseModel): Enter a valid PromQL expression that defines the condition for triggering this alert. The alert will fire when this expression evaluates to true for the duration specified in the duration to trigger alert field. """ - for_: typing_extensions.Annotated[float, FieldMetadata(alias="for")] = pydantic.Field() + for_: typing_extensions.Annotated[float, FieldMetadata(alias="for")] = pydantic.Field(alias="for") """ The prometheus expression must remain true for this duration (in seconds) before the alert is triggered. If the condition becomes false before this time elapses, the alert will not fire. """ diff --git a/src/truefoundry_sdk/types/quay_provider_account.py b/src/truefoundry_sdk/types/quay_provider_account.py index 32dafdf..8073706 100644 --- a/src/truefoundry_sdk/types/quay_provider_account.py +++ b/src/truefoundry_sdk/types/quay_provider_account.py @@ -37,7 +37,9 @@ class QuayProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/recommendation.py b/src/truefoundry_sdk/types/recommendation.py index c24864e..c6f01d7 100644 --- a/src/truefoundry_sdk/types/recommendation.py +++ b/src/truefoundry_sdk/types/recommendation.py @@ -11,22 +11,36 @@ class Recommendation(UniversalBaseModel): id: typing.Optional[str] = None - cluster_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="clusterId")] = None - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = None - deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = None + cluster_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="clusterId")] = pydantic.Field( + alias="clusterId", default=None + ) + application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( + pydantic.Field(alias="applicationId", default=None) + ) + deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = ( + pydantic.Field(alias="deploymentId", default=None) + ) application_version: typing_extensions.Annotated[ typing.Optional[int], FieldMetadata(alias="applicationVersion") - ] = None + ] = pydantic.Field(alias="applicationVersion", default=None) recommendation_data: typing_extensions.Annotated[ typing.Dict[str, typing.Any], FieldMetadata(alias="recommendationData") - ] - recommendation_type: typing_extensions.Annotated[str, FieldMetadata(alias="recommendationType")] + ] = pydantic.Field(alias="recommendationData") + recommendation_type: typing_extensions.Annotated[str, FieldMetadata(alias="recommendationType")] = pydantic.Field( + alias="recommendationType" + ) applied_deployment_id: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="appliedDeploymentId") - ] = None - expiry_timestamp: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="expiryTimestamp")] - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + ] = pydantic.Field(alias="appliedDeploymentId", default=None) + expiry_timestamp: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="expiryTimestamp")] = pydantic.Field( + alias="expiryTimestamp" + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/role_manifest.py b/src/truefoundry_sdk/types/role_manifest.py index 2b89596..51351f3 100644 --- a/src/truefoundry_sdk/types/role_manifest.py +++ b/src/truefoundry_sdk/types/role_manifest.py @@ -20,7 +20,9 @@ class RoleManifest(UniversalBaseModel): Unique identifier of the role across the organization """ - display_name: typing_extensions.Annotated[str, FieldMetadata(alias="displayName")] = pydantic.Field() + display_name: typing_extensions.Annotated[str, FieldMetadata(alias="displayName")] = pydantic.Field( + alias="displayName" + ) """ Human-readable name for the role """ @@ -30,7 +32,9 @@ class RoleManifest(UniversalBaseModel): Description of the role that explains its purpose and permissions """ - resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field() + resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field( + alias="resourceType" + ) """ Type of resource this role applies to """ diff --git a/src/truefoundry_sdk/types/role_permissions.py b/src/truefoundry_sdk/types/role_permissions.py index d618bbc..7c88949 100644 --- a/src/truefoundry_sdk/types/role_permissions.py +++ b/src/truefoundry_sdk/types/role_permissions.py @@ -9,7 +9,9 @@ class RolePermissions(UniversalBaseModel): - resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field() + resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field( + alias="resourceType" + ) """ Type of resource this role can perform actions on """ diff --git a/src/truefoundry_sdk/types/samba_nova_provider_account.py b/src/truefoundry_sdk/types/samba_nova_provider_account.py index 91f45eb..8e27b74 100644 --- a/src/truefoundry_sdk/types/samba_nova_provider_account.py +++ b/src/truefoundry_sdk/types/samba_nova_provider_account.py @@ -38,7 +38,9 @@ class SambaNovaProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/secret.py b/src/truefoundry_sdk/types/secret.py index 776c368..029a74c 100644 --- a/src/truefoundry_sdk/types/secret.py +++ b/src/truefoundry_sdk/types/secret.py @@ -16,20 +16,28 @@ class Secret(UniversalBaseModel): id: str fqn: str name: str - secret_group_id: typing_extensions.Annotated[str, FieldMetadata(alias="secretGroupId")] + secret_group_id: typing_extensions.Annotated[str, FieldMetadata(alias="secretGroupId")] = pydantic.Field( + alias="secretGroupId" + ) value: typing.Optional[str] = None created_by_subject: typing_extensions.Annotated[ typing.Optional[Subject], FieldMetadata(alias="createdBySubject") - ] = None - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + ] = pydantic.Field(alias="createdBySubject", default=None) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) secret_versions: typing_extensions.Annotated[ typing.Optional[typing.List["SecretVersion"]], FieldMetadata(alias="secretVersions") - ] = None + ] = pydantic.Field(alias="secretVersions", default=None) active_deployments_count: typing_extensions.Annotated[ typing.Optional[int], FieldMetadata(alias="activeDeploymentsCount") - ] = None - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + ] = pydantic.Field(alias="activeDeploymentsCount", default=None) + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/secret_group.py b/src/truefoundry_sdk/types/secret_group.py index 5976fc9..0270e17 100644 --- a/src/truefoundry_sdk/types/secret_group.py +++ b/src/truefoundry_sdk/types/secret_group.py @@ -16,14 +16,28 @@ class SecretGroup(UniversalBaseModel): id: typing.Optional[str] = None fqn: typing.Optional[str] = None name: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - associated_secrets: typing_extensions.Annotated[typing.List["Secret"], FieldMetadata(alias="associatedSecrets")] - integration_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="integrationId")] = None + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + associated_secrets: typing_extensions.Annotated[typing.List["Secret"], FieldMetadata(alias="associatedSecrets")] = ( + pydantic.Field(alias="associatedSecrets") + ) + integration_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="integrationId")] = ( + pydantic.Field(alias="integrationId", default=None) + ) manifest: typing.Optional[typing.Dict[str, typing.Any]] = None - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt" + ) + updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt" + ) + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/secret_version.py b/src/truefoundry_sdk/types/secret_version.py index e85cda8..9e91c22 100644 --- a/src/truefoundry_sdk/types/secret_version.py +++ b/src/truefoundry_sdk/types/secret_version.py @@ -17,9 +17,15 @@ class SecretVersion(UniversalBaseModel): value: typing.Optional[str] = None version: typing.Optional[float] = None secret: typing.Optional["Secret"] = None - secret_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="secretId")] = None - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = None - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = None + secret_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="secretId")] = pydantic.Field( + alias="secretId", default=None + ) + created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( + pydantic.Field(alias="createdAt", default=None) + ) + updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( + pydantic.Field(alias="updatedAt", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/self_hosted_model_provider_account.py b/src/truefoundry_sdk/types/self_hosted_model_provider_account.py index 106a39c..caf9aa1 100644 --- a/src/truefoundry_sdk/types/self_hosted_model_provider_account.py +++ b/src/truefoundry_sdk/types/self_hosted_model_provider_account.py @@ -38,7 +38,9 @@ class SelfHostedModelProviderAccount(UniversalBaseModel): Collaborators """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/session.py b/src/truefoundry_sdk/types/session.py index d1b9506..45a2b2c 100644 --- a/src/truefoundry_sdk/types/session.py +++ b/src/truefoundry_sdk/types/session.py @@ -13,22 +13,32 @@ class Session(UniversalBaseModel): id: str - user_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="userName")] = None - subject_slug: typing_extensions.Annotated[str, FieldMetadata(alias="subjectSlug")] + user_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="userName")] = pydantic.Field( + alias="userName", default=None + ) + subject_slug: typing_extensions.Annotated[str, FieldMetadata(alias="subjectSlug")] = pydantic.Field( + alias="subjectSlug" + ) subject_controller_name: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="subjectControllerName") - ] = None - subject_pat_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="subjectPatName")] = None + ] = pydantic.Field(alias="subjectControllerName", default=None) + subject_pat_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="subjectPatName")] = ( + pydantic.Field(alias="subjectPatName", default=None) + ) email: typing.Optional[str] = None - subject_type: typing_extensions.Annotated[SubjectType, FieldMetadata(alias="subjectType")] - tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = None + subject_type: typing_extensions.Annotated[SubjectType, FieldMetadata(alias="subjectType")] = pydantic.Field( + alias="subjectType" + ) + tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName", default=None + ) roles: typing.List[str] teams: typing.List[str] accounts: typing.List[str] metadata: typing.Optional[UserMetadata] = None service_account_metadata: typing_extensions.Annotated[ typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="serviceAccountMetadata") - ] = None + ] = pydantic.Field(alias="serviceAccountMetadata", default=None) account: typing.Optional[Account] = None if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/slack_provider_account.py b/src/truefoundry_sdk/types/slack_provider_account.py index ad69d58..c52f1a8 100644 --- a/src/truefoundry_sdk/types/slack_provider_account.py +++ b/src/truefoundry_sdk/types/slack_provider_account.py @@ -30,7 +30,9 @@ class SlackProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py b/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py index 2f4623e..7a3df22 100644 --- a/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py +++ b/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py @@ -45,7 +45,9 @@ class SnowflakeCortexProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/span_attribute_filter.py b/src/truefoundry_sdk/types/span_attribute_filter.py index f5900c0..11edeaa 100644 --- a/src/truefoundry_sdk/types/span_attribute_filter.py +++ b/src/truefoundry_sdk/types/span_attribute_filter.py @@ -11,7 +11,9 @@ class SpanAttributeFilter(UniversalBaseModel): - span_attribute_key: typing_extensions.Annotated[str, FieldMetadata(alias="spanAttributeKey")] + span_attribute_key: typing_extensions.Annotated[str, FieldMetadata(alias="spanAttributeKey")] = pydantic.Field( + alias="spanAttributeKey" + ) operator: SpanAttributeFilterOperator value: SpanAttributeFilterValue diff --git a/src/truefoundry_sdk/types/span_field_filter.py b/src/truefoundry_sdk/types/span_field_filter.py index cdd5f47..a4eebee 100644 --- a/src/truefoundry_sdk/types/span_field_filter.py +++ b/src/truefoundry_sdk/types/span_field_filter.py @@ -12,7 +12,9 @@ class SpanFieldFilter(UniversalBaseModel): - span_field_name: typing_extensions.Annotated[SpanFieldFilterSpanFieldName, FieldMetadata(alias="spanFieldName")] + span_field_name: typing_extensions.Annotated[SpanFieldFilterSpanFieldName, FieldMetadata(alias="spanFieldName")] = ( + pydantic.Field(alias="spanFieldName") + ) operator: SpanFieldFilterOperator value: SpanFieldFilterValue diff --git a/src/truefoundry_sdk/types/spark_job_trigger_input.py b/src/truefoundry_sdk/types/spark_job_trigger_input.py index a550a66..57c3fc8 100644 --- a/src/truefoundry_sdk/types/spark_job_trigger_input.py +++ b/src/truefoundry_sdk/types/spark_job_trigger_input.py @@ -10,7 +10,7 @@ class SparkJobTriggerInput(UniversalBaseModel): main_class: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="mainClass")] = pydantic.Field( - default=None + alias="mainClass", default=None ) """ Main Class for Spark Job @@ -18,7 +18,7 @@ class SparkJobTriggerInput(UniversalBaseModel): main_application_file: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="mainApplicationFile") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="mainApplicationFile", default=None) """ Main Application File for Spark Job """ diff --git a/src/truefoundry_sdk/types/subject.py b/src/truefoundry_sdk/types/subject.py index 9609f41..2418a40 100644 --- a/src/truefoundry_sdk/types/subject.py +++ b/src/truefoundry_sdk/types/subject.py @@ -10,18 +10,20 @@ class Subject(UniversalBaseModel): - subject_id: typing_extensions.Annotated[str, FieldMetadata(alias="subjectId")] = pydantic.Field() + subject_id: typing_extensions.Annotated[str, FieldMetadata(alias="subjectId")] = pydantic.Field(alias="subjectId") """ Subject ID """ - subject_type: typing_extensions.Annotated[SubjectType, FieldMetadata(alias="subjectType")] = pydantic.Field() + subject_type: typing_extensions.Annotated[SubjectType, FieldMetadata(alias="subjectType")] = pydantic.Field( + alias="subjectType" + ) """ Subject type """ subject_slug: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="subjectSlug")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="subjectSlug", default=None) ) """ Subject slug @@ -29,7 +31,7 @@ class Subject(UniversalBaseModel): subject_display_name: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="subjectDisplayName") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="subjectDisplayName", default=None) """ Subject display name """ diff --git a/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py b/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py index 36dd1b8..96bfb46 100644 --- a/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py +++ b/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py @@ -9,7 +9,7 @@ class SyncTokenInSecretStoreInfo(UniversalBaseModel): - updated_at: typing_extensions.Annotated[str, FieldMetadata(alias="updatedAt")] = pydantic.Field() + updated_at: typing_extensions.Annotated[str, FieldMetadata(alias="updatedAt")] = pydantic.Field(alias="updatedAt") """ ISO timestamp of when the token was synced """ diff --git a/src/truefoundry_sdk/types/sync_virtual_account_token_response.py b/src/truefoundry_sdk/types/sync_virtual_account_token_response.py index 097e1c2..ce2caa3 100644 --- a/src/truefoundry_sdk/types/sync_virtual_account_token_response.py +++ b/src/truefoundry_sdk/types/sync_virtual_account_token_response.py @@ -12,7 +12,7 @@ class SyncVirtualAccountTokenResponse(UniversalBaseModel): sync_token_in_secret_store_info: typing_extensions.Annotated[ SyncTokenInSecretStoreInfo, FieldMetadata(alias="syncTokenInSecretStoreInfo") - ] = pydantic.Field() + ] = pydantic.Field(alias="syncTokenInSecretStoreInfo") """ Sync status including timestamp and error (if any) """ diff --git a/src/truefoundry_sdk/types/team.py b/src/truefoundry_sdk/types/team.py index 5b7e720..9433c76 100644 --- a/src/truefoundry_sdk/types/team.py +++ b/src/truefoundry_sdk/types/team.py @@ -13,14 +13,24 @@ class Team(UniversalBaseModel): id: str - team_name: typing_extensions.Annotated[str, FieldMetadata(alias="teamName")] + team_name: typing_extensions.Annotated[str, FieldMetadata(alias="teamName")] = pydantic.Field(alias="teamName") description: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] - account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = None - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) + account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = pydantic.Field( + alias="accountId", default=None + ) + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) members: typing.Optional[typing.List[str]] = None - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] + created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt" + ) + updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt" + ) manifest: TeamManifest if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/team_manifest.py b/src/truefoundry_sdk/types/team_manifest.py index 560c481..210ad43 100644 --- a/src/truefoundry_sdk/types/team_manifest.py +++ b/src/truefoundry_sdk/types/team_manifest.py @@ -30,7 +30,9 @@ class TeamManifest(UniversalBaseModel): Enter email of each of the user you want to add in the team. """ - owned_by: typing_extensions.Annotated[typing.Optional[TeamOwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[TeamOwnedBy], FieldMetadata(alias="ownedBy")] = ( + pydantic.Field(alias="ownedBy", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/terminate_job_response.py b/src/truefoundry_sdk/types/terminate_job_response.py index 91e4bf7..e7d4ed9 100644 --- a/src/truefoundry_sdk/types/terminate_job_response.py +++ b/src/truefoundry_sdk/types/terminate_job_response.py @@ -15,7 +15,9 @@ class TerminateJobResponse(UniversalBaseModel): Terminate Job Message """ - job_run_status: typing_extensions.Annotated[JobRunStatus, FieldMetadata(alias="jobRunStatus")] = pydantic.Field() + job_run_status: typing_extensions.Annotated[JobRunStatus, FieldMetadata(alias="jobRunStatus")] = pydantic.Field( + alias="jobRunStatus" + ) """ Job run status """ diff --git a/src/truefoundry_sdk/types/together_ai_provider_account.py b/src/truefoundry_sdk/types/together_ai_provider_account.py index dcadca7..bd3332e 100644 --- a/src/truefoundry_sdk/types/together_ai_provider_account.py +++ b/src/truefoundry_sdk/types/together_ai_provider_account.py @@ -38,7 +38,9 @@ class TogetherAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/token_pagination.py b/src/truefoundry_sdk/types/token_pagination.py index 322ccee..ccb08a2 100644 --- a/src/truefoundry_sdk/types/token_pagination.py +++ b/src/truefoundry_sdk/types/token_pagination.py @@ -15,14 +15,14 @@ class TokenPagination(UniversalBaseModel): """ next_page_token: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="nextPageToken")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="nextPageToken", default=None) ) """ Base64 encoded token for the next page """ previous_page_token: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="previousPageToken")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="previousPageToken", default=None) ) """ Base64 encoded token for the previous page diff --git a/src/truefoundry_sdk/types/trace_span.py b/src/truefoundry_sdk/types/trace_span.py index d30cbec..03c8edc 100644 --- a/src/truefoundry_sdk/types/trace_span.py +++ b/src/truefoundry_sdk/types/trace_span.py @@ -10,42 +10,48 @@ class TraceSpan(UniversalBaseModel): - span_id: typing_extensions.Annotated[str, FieldMetadata(alias="spanId")] = pydantic.Field() + span_id: typing_extensions.Annotated[str, FieldMetadata(alias="spanId")] = pydantic.Field(alias="spanId") """ Unique identifier for the span within the trace. """ - trace_id: typing_extensions.Annotated[str, FieldMetadata(alias="traceId")] = pydantic.Field() + trace_id: typing_extensions.Annotated[str, FieldMetadata(alias="traceId")] = pydantic.Field(alias="traceId") """ Unique identifier for the trace that contains this span. """ - parent_span_id: typing_extensions.Annotated[str, FieldMetadata(alias="parentSpanId")] = pydantic.Field() + parent_span_id: typing_extensions.Annotated[str, FieldMetadata(alias="parentSpanId")] = pydantic.Field( + alias="parentSpanId" + ) """ Identifier of the parent span in the trace hierarchy. """ - service_name: typing_extensions.Annotated[str, FieldMetadata(alias="serviceName")] = pydantic.Field() + service_name: typing_extensions.Annotated[str, FieldMetadata(alias="serviceName")] = pydantic.Field( + alias="serviceName" + ) """ Name of the service that generated this span. """ - span_name: typing_extensions.Annotated[str, FieldMetadata(alias="spanName")] = pydantic.Field() + span_name: typing_extensions.Annotated[str, FieldMetadata(alias="spanName")] = pydantic.Field(alias="spanName") """ Name of the span """ - span_kind: typing_extensions.Annotated[str, FieldMetadata(alias="spanKind")] = pydantic.Field() + span_kind: typing_extensions.Annotated[str, FieldMetadata(alias="spanKind")] = pydantic.Field(alias="spanKind") """ Type of span (e.g., CLIENT, SERVER, INTERNAL, PRODUCER, CONSUMER). """ - scope_name: typing_extensions.Annotated[str, FieldMetadata(alias="scopeName")] = pydantic.Field() + scope_name: typing_extensions.Annotated[str, FieldMetadata(alias="scopeName")] = pydantic.Field(alias="scopeName") """ Name of the instrumentation scope that created this span. """ - scope_version: typing_extensions.Annotated[str, FieldMetadata(alias="scopeVersion")] = pydantic.Field() + scope_version: typing_extensions.Annotated[str, FieldMetadata(alias="scopeVersion")] = pydantic.Field( + alias="scopeVersion" + ) """ Version of the instrumentation scope that created this span. """ @@ -55,24 +61,30 @@ class TraceSpan(UniversalBaseModel): Timestamp in ISO 8601 format (e.g., 2025-03-12T00:00:09.872Z). """ - duration_ns: typing_extensions.Annotated[float, FieldMetadata(alias="durationNs")] = pydantic.Field() + duration_ns: typing_extensions.Annotated[float, FieldMetadata(alias="durationNs")] = pydantic.Field( + alias="durationNs" + ) """ Duration of the span in nanoseconds. """ - status_code: typing_extensions.Annotated[str, FieldMetadata(alias="statusCode")] = pydantic.Field() + status_code: typing_extensions.Annotated[str, FieldMetadata(alias="statusCode")] = pydantic.Field( + alias="statusCode" + ) """ Status code of the span (e.g., OK, ERROR, UNSET). """ - status_message: typing_extensions.Annotated[str, FieldMetadata(alias="statusMessage")] = pydantic.Field() + status_message: typing_extensions.Annotated[str, FieldMetadata(alias="statusMessage")] = pydantic.Field( + alias="statusMessage" + ) """ Human-readable status message describing the span result. """ span_attributes: typing_extensions.Annotated[ typing.Dict[str, typing.Any], FieldMetadata(alias="spanAttributes") - ] = pydantic.Field() + ] = pydantic.Field(alias="spanAttributes") """ Key-value pairs containing additional metadata about the span. """ @@ -82,7 +94,9 @@ class TraceSpan(UniversalBaseModel): Array of events that occurred during the span execution. """ - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field() + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) """ Subject (user or virtualaccount) that created this span. """ diff --git a/src/truefoundry_sdk/types/trigger_job_run_response.py b/src/truefoundry_sdk/types/trigger_job_run_response.py index 8bcdcba..89ddd00 100644 --- a/src/truefoundry_sdk/types/trigger_job_run_response.py +++ b/src/truefoundry_sdk/types/trigger_job_run_response.py @@ -15,7 +15,9 @@ class TriggerJobRunResponse(UniversalBaseModel): Job triggered """ - job_run_name: typing_extensions.Annotated[str, FieldMetadata(alias="jobRunName")] = pydantic.Field() + job_run_name: typing_extensions.Annotated[str, FieldMetadata(alias="jobRunName")] = pydantic.Field( + alias="jobRunName" + ) """ Name of the job run """ diff --git a/src/truefoundry_sdk/types/true_foundry_apply_response.py b/src/truefoundry_sdk/types/true_foundry_apply_response.py index bfcf75c..9b553de 100644 --- a/src/truefoundry_sdk/types/true_foundry_apply_response.py +++ b/src/truefoundry_sdk/types/true_foundry_apply_response.py @@ -13,7 +13,7 @@ class TrueFoundryApplyResponse(UniversalBaseModel): existing_manifest: typing_extensions.Annotated[ typing.Optional[TrueFoundryApplyResponseExistingManifest], FieldMetadata(alias="existingManifest") - ] = pydantic.Field(default=None) + ] = pydantic.Field(alias="existingManifest", default=None) """ The existing manifest of the resource """ diff --git a/src/truefoundry_sdk/types/true_foundry_provider_account.py b/src/truefoundry_sdk/types/true_foundry_provider_account.py index a37187a..609677d 100644 --- a/src/truefoundry_sdk/types/true_foundry_provider_account.py +++ b/src/truefoundry_sdk/types/true_foundry_provider_account.py @@ -30,7 +30,9 @@ class TrueFoundryProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/ttl_provider_account.py b/src/truefoundry_sdk/types/ttl_provider_account.py index ff0fe4e..23eb6fd 100644 --- a/src/truefoundry_sdk/types/ttl_provider_account.py +++ b/src/truefoundry_sdk/types/ttl_provider_account.py @@ -30,7 +30,9 @@ class TtlProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/upgrade_data.py b/src/truefoundry_sdk/types/upgrade_data.py index 3008805..0a7a1f8 100644 --- a/src/truefoundry_sdk/types/upgrade_data.py +++ b/src/truefoundry_sdk/types/upgrade_data.py @@ -13,13 +13,21 @@ class UpgradeData(UniversalBaseModel): diff: typing.Optional[typing.List["IChange"]] = None - current_manifest: typing_extensions.Annotated[typing.Optional[Helm], FieldMetadata(alias="currentManifest")] = None - desired_manifest: typing_extensions.Annotated[typing.Optional[Helm], FieldMetadata(alias="desiredManifest")] = None - upgrade_possible: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="upgradePossible")] = None + current_manifest: typing_extensions.Annotated[typing.Optional[Helm], FieldMetadata(alias="currentManifest")] = ( + pydantic.Field(alias="currentManifest", default=None) + ) + desired_manifest: typing_extensions.Annotated[typing.Optional[Helm], FieldMetadata(alias="desiredManifest")] = ( + pydantic.Field(alias="desiredManifest", default=None) + ) + upgrade_possible: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="upgradePossible")] = ( + pydantic.Field(alias="upgradePossible", default=None) + ) conflict_fields: typing_extensions.Annotated[ typing.Optional[typing.List[str]], FieldMetadata(alias="conflictFields") - ] = None - has_conflict: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="hasConflict")] = None + ] = pydantic.Field(alias="conflictFields", default=None) + has_conflict: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="hasConflict")] = ( + pydantic.Field(alias="hasConflict", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/user.py b/src/truefoundry_sdk/types/user.py index 2ebdb0e..5cc8058 100644 --- a/src/truefoundry_sdk/types/user.py +++ b/src/truefoundry_sdk/types/user.py @@ -14,15 +14,21 @@ class User(UniversalBaseModel): id: str email: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) metadata: UserMetadata roles: typing.Optional[typing.List[str]] = None roles_with_resource: typing_extensions.Annotated[ typing.Optional[typing.List[UserRoleWithResource]], FieldMetadata(alias="rolesWithResource") - ] = None + ] = pydantic.Field(alias="rolesWithResource", default=None) active: bool - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] + created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt" + ) + updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt" + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/user_metadata.py b/src/truefoundry_sdk/types/user_metadata.py index 2b5326b..299c5c2 100644 --- a/src/truefoundry_sdk/types/user_metadata.py +++ b/src/truefoundry_sdk/types/user_metadata.py @@ -11,20 +11,32 @@ class UserMetadata(UniversalBaseModel): sub: typing.Optional[str] = None - image_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="imageURL")] = None - display_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="displayName")] = None + image_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="imageURL")] = pydantic.Field( + alias="imageURL", default=None + ) + display_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="displayName")] = ( + pydantic.Field(alias="displayName", default=None) + ) user_object: typing_extensions.Annotated[ typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="userObject") - ] = None - invite_accepted: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="inviteAccepted")] = None - registered_in_idp: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="registeredInIdp")] = None + ] = pydantic.Field(alias="userObject", default=None) + invite_accepted: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="inviteAccepted")] = ( + pydantic.Field(alias="inviteAccepted", default=None) + ) + registered_in_idp: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="registeredInIdp")] = ( + pydantic.Field(alias="registeredInIdp", default=None) + ) preference: typing.Optional[typing.Dict[str, typing.Any]] = None groups: typing.Optional[typing.List[str]] = None tenant_role_managed_by: typing_extensions.Annotated[ typing.Optional[UserMetadataTenantRoleManagedBy], FieldMetadata(alias="tenantRoleManagedBy") - ] = None - sso_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="ssoName")] = None - is_primary_sso: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isPrimarySSO")] = None + ] = pydantic.Field(alias="tenantRoleManagedBy", default=None) + sso_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="ssoName")] = pydantic.Field( + alias="ssoName", default=None + ) + is_primary_sso: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isPrimarySSO")] = ( + pydantic.Field(alias="isPrimarySSO", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/user_resource.py b/src/truefoundry_sdk/types/user_resource.py index 77e6936..b801485 100644 --- a/src/truefoundry_sdk/types/user_resource.py +++ b/src/truefoundry_sdk/types/user_resource.py @@ -9,23 +9,27 @@ class UserResource(UniversalBaseModel): - resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field() + resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field( + alias="resourceType" + ) """ Resource Type """ - resource_id: typing_extensions.Annotated[str, FieldMetadata(alias="resourceId")] = pydantic.Field() + resource_id: typing_extensions.Annotated[str, FieldMetadata(alias="resourceId")] = pydantic.Field( + alias="resourceId" + ) """ Resource ID """ - role_id: typing_extensions.Annotated[str, FieldMetadata(alias="roleId")] = pydantic.Field() + role_id: typing_extensions.Annotated[str, FieldMetadata(alias="roleId")] = pydantic.Field(alias="roleId") """ Role ID """ resource_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="resourceName")] = ( - pydantic.Field(default=None) + pydantic.Field(alias="resourceName", default=None) ) """ Resource Name (if available) diff --git a/src/truefoundry_sdk/types/user_role_with_resource.py b/src/truefoundry_sdk/types/user_role_with_resource.py index 7f96384..c90974f 100644 --- a/src/truefoundry_sdk/types/user_role_with_resource.py +++ b/src/truefoundry_sdk/types/user_role_with_resource.py @@ -10,9 +10,13 @@ class UserRoleWithResource(UniversalBaseModel): - role_id: typing_extensions.Annotated[str, FieldMetadata(alias="roleId")] - resource_type: typing_extensions.Annotated[UserRoleWithResourceResourceType, FieldMetadata(alias="resourceType")] - resource_id: typing_extensions.Annotated[str, FieldMetadata(alias="resourceId")] + role_id: typing_extensions.Annotated[str, FieldMetadata(alias="roleId")] = pydantic.Field(alias="roleId") + resource_type: typing_extensions.Annotated[ + UserRoleWithResourceResourceType, FieldMetadata(alias="resourceType") + ] = pydantic.Field(alias="resourceType") + resource_id: typing_extensions.Annotated[str, FieldMetadata(alias="resourceId")] = pydantic.Field( + alias="resourceId" + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/virtual_account.py b/src/truefoundry_sdk/types/virtual_account.py index 61ed033..7369f24 100644 --- a/src/truefoundry_sdk/types/virtual_account.py +++ b/src/truefoundry_sdk/types/virtual_account.py @@ -16,21 +16,39 @@ class VirtualAccount(UniversalBaseModel): id: str name: str type: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) manifest: typing.Optional[VirtualAccountManifest] = None - jwt_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="jwtId")] = None - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] - is_expired: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isExpired")] = None + jwt_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="jwtId")] = pydantic.Field( + alias="jwtId", default=None + ) + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt" + ) + updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt" + ) + is_expired: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isExpired")] = pydantic.Field( + alias="isExpired", default=None + ) jwts: typing.Optional[typing.List[Jwt]] = None - account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = None + account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = pydantic.Field( + alias="accountId", default=None + ) metadata: typing.Optional[typing.Dict[str, typing.Any]] = None - role_ids: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="roleIds")] = None - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + role_ids: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="roleIds")] = ( + pydantic.Field(alias="roleIds", default=None) + ) + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) next_scheduled_rotation: typing_extensions.Annotated[ typing.Optional[str], FieldMetadata(alias="nextScheduledRotation") - ] = None + ] = pydantic.Field(alias="nextScheduledRotation", default=None) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/virtual_account_manifest.py b/src/truefoundry_sdk/types/virtual_account_manifest.py index 04a080a..3e9ec52 100644 --- a/src/truefoundry_sdk/types/virtual_account_manifest.py +++ b/src/truefoundry_sdk/types/virtual_account_manifest.py @@ -37,7 +37,9 @@ class VirtualAccountManifest(UniversalBaseModel): auto_rotate: typing.Optional[AutoRotate] = None notification_target: typing.Optional[NotificationTarget] = None secret_store_config: typing.Optional[SecretStoreConfig] = None - owned_by: typing_extensions.Annotated[typing.Optional[VirtualAccountOwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[VirtualAccountOwnedBy], FieldMetadata(alias="ownedBy")] = ( + pydantic.Field(alias="ownedBy", default=None) + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/virtual_model_provider_account.py b/src/truefoundry_sdk/types/virtual_model_provider_account.py index 1a9cf17..a34824c 100644 --- a/src/truefoundry_sdk/types/virtual_model_provider_account.py +++ b/src/truefoundry_sdk/types/virtual_model_provider_account.py @@ -36,7 +36,9 @@ class VirtualModelProviderAccount(UniversalBaseModel): List of users who have access to this Virtual Model Provider Group """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/webhook_provider_account.py b/src/truefoundry_sdk/types/webhook_provider_account.py index 982f3e2..206972b 100644 --- a/src/truefoundry_sdk/types/webhook_provider_account.py +++ b/src/truefoundry_sdk/types/webhook_provider_account.py @@ -30,7 +30,9 @@ class WebhookProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/workspace.py b/src/truefoundry_sdk/types/workspace.py index 32410f7..9fd31f7 100644 --- a/src/truefoundry_sdk/types/workspace.py +++ b/src/truefoundry_sdk/types/workspace.py @@ -15,16 +15,32 @@ class Workspace(UniversalBaseModel): id: str fqn: str name: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] - cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId")] - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] - environment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="environmentId")] = None + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( + alias="tenantName" + ) + cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId")] = pydantic.Field(alias="clusterId") + created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( + alias="createdBySubject" + ) + created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( + alias="createdAt" + ) + updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( + alias="updatedAt" + ) + environment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="environmentId")] = ( + pydantic.Field(alias="environmentId", default=None) + ) manifest: WorkspaceManifest - account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = None - is_system_ws: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isSystemWs")] = None - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = None + account_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="accountId")] = pydantic.Field( + alias="accountId", default=None + ) + is_system_ws: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isSystemWs")] = ( + pydantic.Field(alias="isSystemWs", default=None) + ) + created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( + alias="createdBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/workspace_manifest.py b/src/truefoundry_sdk/types/workspace_manifest.py index c344e0d..c113410 100644 --- a/src/truefoundry_sdk/types/workspace_manifest.py +++ b/src/truefoundry_sdk/types/workspace_manifest.py @@ -52,7 +52,9 @@ class WorkspaceManifest(UniversalBaseModel): Permissions """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = None + owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( + alias="ownedBy", default=None + ) if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/users/raw_client.py b/src/truefoundry_sdk/users/raw_client.py index 2b4e346..6c67182 100644 --- a/src/truefoundry_sdk/users/raw_client.py +++ b/src/truefoundry_sdk/users/raw_client.py @@ -102,7 +102,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), query=query, show_invalid_users=show_invalid_users, include_virtual_accounts=include_virtual_accounts, @@ -899,7 +899,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), query=query, show_invalid_users=show_invalid_users, include_virtual_accounts=include_virtual_accounts, diff --git a/src/truefoundry_sdk/virtual_accounts/raw_client.py b/src/truefoundry_sdk/virtual_accounts/raw_client.py index 45181b3..38f4b42 100644 --- a/src/truefoundry_sdk/virtual_accounts/raw_client.py +++ b/src/truefoundry_sdk/virtual_accounts/raw_client.py @@ -80,7 +80,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -507,7 +507,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), request_options=request_options, ) diff --git a/src/truefoundry_sdk/workspaces/raw_client.py b/src/truefoundry_sdk/workspaces/raw_client.py index f9fffcc..7531aea 100644 --- a/src/truefoundry_sdk/workspaces/raw_client.py +++ b/src/truefoundry_sdk/workspaces/raw_client.py @@ -96,7 +96,7 @@ def list( _has_next = True _get_next = lambda: self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), cluster_id=cluster_id, name=name, fqn=fqn, @@ -395,7 +395,7 @@ async def list( async def _get_next(): return await self.list( limit=limit, - offset=offset + len(_items), + offset=offset + len(_items or []), cluster_id=cluster_id, name=name, fqn=fqn, diff --git a/tests/utils/test_http_client.py b/tests/utils/test_http_client.py index 2e7743f..e208358 100644 --- a/tests/utils/test_http_client.py +++ b/tests/utils/test_http_client.py @@ -1,9 +1,49 @@ # This file was auto-generated by Fern from our API Definition. -from truefoundry_sdk.core.http_client import get_request_body, remove_none_from_dict +from typing import Any, Dict + +import pytest + +from truefoundry_sdk.core.http_client import ( + AsyncHttpClient, + HttpClient, + _build_url, + get_request_body, + remove_none_from_dict, +) from truefoundry_sdk.core.request_options import RequestOptions +# Stub clients for testing HttpClient and AsyncHttpClient +class _DummySyncClient: + """A minimal stub for httpx.Client that records request arguments.""" + + def __init__(self) -> None: + self.last_request_kwargs: Dict[str, Any] = {} + + def request(self, **kwargs: Any) -> "_DummyResponse": + self.last_request_kwargs = kwargs + return _DummyResponse() + + +class _DummyAsyncClient: + """A minimal stub for httpx.AsyncClient that records request arguments.""" + + def __init__(self) -> None: + self.last_request_kwargs: Dict[str, Any] = {} + + async def request(self, **kwargs: Any) -> "_DummyResponse": + self.last_request_kwargs = kwargs + return _DummyResponse() + + +class _DummyResponse: + """A minimal stub for httpx.Response.""" + + status_code = 200 + headers: Dict[str, str] = {} + + def get_request_options() -> RequestOptions: return {"additional_body_parameters": {"see you": "later"}} @@ -52,17 +92,30 @@ def test_get_none_request_body() -> None: def test_get_empty_json_request_body() -> None: + """Test that implicit empty bodies (json=None) are collapsed to None.""" unrelated_request_options: RequestOptions = {"max_retries": 3} json_body, data_body = get_request_body(json=None, data=None, request_options=unrelated_request_options, omit=None) assert json_body is None assert data_body is None - json_body_extras, data_body_extras = get_request_body( - json={}, data=None, request_options=unrelated_request_options, omit=None - ) - assert json_body_extras is None - assert data_body_extras is None +def test_explicit_empty_json_body_is_preserved() -> None: + """Test that explicit empty bodies (json={}) are preserved and sent as {}. + + This is important for endpoints where the request body is required but all + fields are optional. The server expects valid JSON ({}) not an empty body. + """ + unrelated_request_options: RequestOptions = {"max_retries": 3} + + # Explicit json={} should be preserved + json_body, data_body = get_request_body(json={}, data=None, request_options=unrelated_request_options, omit=None) + assert json_body == {} + assert data_body is None + + # Explicit data={} should also be preserved + json_body2, data_body2 = get_request_body(json=None, data={}, request_options=unrelated_request_options, omit=None) + assert json_body2 is None + assert data_body2 == {} def test_json_body_preserves_none_values() -> None: @@ -107,3 +160,141 @@ def test_remove_none_from_dict_empty_dict() -> None: def test_remove_none_from_dict_all_none() -> None: """Test that remove_none_from_dict handles dict with all None values.""" assert remove_none_from_dict({"a": None, "b": None}) == {} + + +def test_http_client_does_not_pass_empty_params_list() -> None: + """Test that HttpClient passes params=None when params are empty. + + This prevents httpx from stripping existing query parameters from the URL, + which happens when params=[] or params={} is passed. + """ + dummy_client = _DummySyncClient() + http_client = HttpClient( + httpx_client=dummy_client, # type: ignore[arg-type] + base_timeout=lambda: None, + base_headers=lambda: {}, + base_url=lambda: "https://example.com", + ) + + # Use a path with query params (e.g., pagination cursor URL) + http_client.request( + path="resource?after=123", + method="GET", + params=None, + request_options=None, + ) + + # We care that httpx receives params=None, not [] or {} + assert "params" in dummy_client.last_request_kwargs + assert dummy_client.last_request_kwargs["params"] is None + + # Verify the query string in the URL is preserved + url = str(dummy_client.last_request_kwargs["url"]) + assert "after=123" in url, f"Expected query param 'after=123' in URL, got: {url}" + + +def test_http_client_passes_encoded_params_when_present() -> None: + """Test that HttpClient passes encoded params when params are provided.""" + dummy_client = _DummySyncClient() + http_client = HttpClient( + httpx_client=dummy_client, # type: ignore[arg-type] + base_timeout=lambda: None, + base_headers=lambda: {}, + base_url=lambda: "https://example.com/resource", + ) + + http_client.request( + path="", + method="GET", + params={"after": "456"}, + request_options=None, + ) + + params = dummy_client.last_request_kwargs["params"] + # For a simple dict, encode_query should give a single (key, value) tuple + assert params == [("after", "456")] + + +@pytest.mark.asyncio +async def test_async_http_client_does_not_pass_empty_params_list() -> None: + """Test that AsyncHttpClient passes params=None when params are empty. + + This prevents httpx from stripping existing query parameters from the URL, + which happens when params=[] or params={} is passed. + """ + dummy_client = _DummyAsyncClient() + http_client = AsyncHttpClient( + httpx_client=dummy_client, # type: ignore[arg-type] + base_timeout=lambda: None, + base_headers=lambda: {}, + base_url=lambda: "https://example.com", + async_base_headers=None, + ) + + # Use a path with query params (e.g., pagination cursor URL) + await http_client.request( + path="resource?after=123", + method="GET", + params=None, + request_options=None, + ) + + # We care that httpx receives params=None, not [] or {} + assert "params" in dummy_client.last_request_kwargs + assert dummy_client.last_request_kwargs["params"] is None + + # Verify the query string in the URL is preserved + url = str(dummy_client.last_request_kwargs["url"]) + assert "after=123" in url, f"Expected query param 'after=123' in URL, got: {url}" + + +@pytest.mark.asyncio +async def test_async_http_client_passes_encoded_params_when_present() -> None: + """Test that AsyncHttpClient passes encoded params when params are provided.""" + dummy_client = _DummyAsyncClient() + http_client = AsyncHttpClient( + httpx_client=dummy_client, # type: ignore[arg-type] + base_timeout=lambda: None, + base_headers=lambda: {}, + base_url=lambda: "https://example.com/resource", + async_base_headers=None, + ) + + await http_client.request( + path="", + method="GET", + params={"after": "456"}, + request_options=None, + ) + + params = dummy_client.last_request_kwargs["params"] + # For a simple dict, encode_query should give a single (key, value) tuple + assert params == [("after", "456")] + + +def test_basic_url_joining() -> None: + """Test basic URL joining with a simple base URL and path.""" + result = _build_url("https://api.example.com", "/users") + assert result == "https://api.example.com/users" + + +def test_basic_url_joining_trailing_slash() -> None: + """Test basic URL joining with a simple base URL and path.""" + result = _build_url("https://api.example.com/", "/users") + assert result == "https://api.example.com/users" + + +def test_preserves_base_url_path_prefix() -> None: + """Test that path prefixes in base URL are preserved. + + This is the critical bug fix - urllib.parse.urljoin() would strip + the path prefix when the path starts with '/'. + """ + result = _build_url("https://cloud.example.com/org/tenant/api", "/users") + assert result == "https://cloud.example.com/org/tenant/api/users" + + +def test_preserves_base_url_path_prefix_trailing_slash() -> None: + """Test that path prefixes in base URL are preserved.""" + result = _build_url("https://cloud.example.com/org/tenant/api/", "/users") + assert result == "https://cloud.example.com/org/tenant/api/users"