diff --git a/README.md b/README.md index 5261276..64078c1 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,34 @@ def test_public_route(): +### 5. Get an access token for a connection + +If you need to get an access token for an upstream idp via a connection, you can use the `get_access_token_for_connection` method on the underlying api_client: + +```python +import asyncio + +from auth0_fastapi_api import Auth0FastAPI + +async def main(): + auth0 = Auth0FastAPI( + domain="", + audience="", + client_id="", + client_secret="", + ) + connection = "my-connection" # The Auth0 connection to the upstream idp + access_token = "..." # The Auth0 access token to exchange + + connection_access_token = await auth0.api_client.get_access_token_for_connection({"connection": connection, "access_token": access_token}) + # The returned token is the access token for the upstream idp + print(connection_access_token) + +asyncio.run(main()) +``` + +More info https://auth0.com/docs/secure/tokens/token-vault + ## Feedback ### Contributing diff --git a/fastapi_plugin/fast_api_client.py b/fastapi_plugin/fast_api_client.py index 677fab8..3da89eb 100644 --- a/fastapi_plugin/fast_api_client.py +++ b/fastapi_plugin/fast_api_client.py @@ -13,7 +13,7 @@ class Auth0FastAPI: mirroring the concept from TypeScript's Fastify plugin. """ - def __init__(self, domain: str, audience: str, custom_fetch=None): + def __init__(self, domain: str, audience: str, client_id=None, client_secret=None, custom_fetch=None): """ domain: Your Auth0 domain (like 'my-tenant.us.auth0.com') audience: API identifier from the Auth0 Dashboard @@ -25,7 +25,7 @@ def __init__(self, domain: str, audience: str, custom_fetch=None): raise ValueError("audience is required.") self.api_client = ApiClient( - ApiClientOptions(domain=domain, audience=audience, custom_fetch=custom_fetch) + ApiClientOptions(domain=domain, audience=audience, client_id=client_id, client_secret=client_secret, custom_fetch=custom_fetch) ) def require_auth( diff --git a/poetry.lock b/poetry.lock index 08503b8..d0834d3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,12 +1,76 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "ada-url" +version = "1.26.0" +description = "URL parser and manipulator based on the WHAT WG URL standard" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ada_url-1.26.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:c2d1578f592be814d40f0a56031809b40500f61cb240966d0ec25ba152b55eb0"}, + {file = "ada_url-1.26.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:321d581274a60f227609be9b6c0863eced4a31b5bf8219d72bf305710d58116d"}, + {file = "ada_url-1.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:071ca476ed5e35651cd39986faea45f100b338147d69218b8170d491d6345baf"}, + {file = "ada_url-1.26.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bc2cb70aa714f4093d8406bef1c1ae8c998818dda4e512645e6fc802959fdf1"}, + {file = "ada_url-1.26.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f50ec59bd673941b4e9563e152d7917eda5859b834f2e63093dafecf9896d396"}, + {file = "ada_url-1.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9d27819cac073dcf0909f3d884198d107d7149ccd21f8c084aed5a6eb2d4e579"}, + {file = "ada_url-1.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ea2ffc0f8976d05217324844a0f18bb90c8ec6ac08c31646a4a4a6396e8af906"}, + {file = "ada_url-1.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:3eb5ce4b81d1f8344d032c69af1804bc1475ba4db3d5b586e6f1dae0884fcbcf"}, + {file = "ada_url-1.26.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:6eec591ed6c13b323501e2ce1f29f0dc731affb11036140119382baa08f17f3b"}, + {file = "ada_url-1.26.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:3f8298b60ddd76f2b225b4e5b16b5def61c157c1cdd856c2093b3fcaa3e98441"}, + {file = "ada_url-1.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba6d518b4bafec467c8d879a1620f0aef400307cb5ae0f96772139f66c611d56"}, + {file = "ada_url-1.26.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfbd6fb73f182ec1488ce24716d64af5fbcc8af90a511a571ca408d8f91d36ad"}, + {file = "ada_url-1.26.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de7b083b700cb71490e9a716ea42c9fee3b4f973aeccde08c6e6066f1184f59a"}, + {file = "ada_url-1.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:272fa1ac5ec60bd1a5399c824e63bbd3084ab1410cb89c5497cc1b3e93513cf2"}, + {file = "ada_url-1.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c244dabc7d88861efee7e822525b89fdcc8fec7d17f89ca0368a90eb401c76d"}, + {file = "ada_url-1.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:db36fa791b80e2f1034c91a41ab489d3b78aead79f52173b67619bd830d3ff83"}, + {file = "ada_url-1.26.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5ad5fca18df30b93aa4196bc236aef37dfb4e8b1ade93deea14c03b9c2d87486"}, + {file = "ada_url-1.26.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:3a52d5e157738519ab504913972e3abf4e800a45574e9b431c4ee88589f213d5"}, + {file = "ada_url-1.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b56a0a685c7440aa7f49ff4827bca55c03ba4c54e7b9744a867d195eca2564b7"}, + {file = "ada_url-1.26.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f060bfdd2774c8313f0353325aeadf9afdd940f4c0833628d3fa4b7b09fe7949"}, + {file = "ada_url-1.26.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e23086b6f65d21a988457cad4cc63235796b1f213a66d7173d05206690fabb69"}, + {file = "ada_url-1.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f3d5b942b19a81236e1aae94bc7315fbeaceeefa2775c2f40ab9196009151da0"}, + {file = "ada_url-1.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4606887898806cc4cbf19a285a1dab131e2409dc293a534c8505ef15eeac7fb7"}, + {file = "ada_url-1.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:09b9a6e47d6084ac64957a947bfadab4fc1117b157cd0463091c46434bb11d01"}, + {file = "ada_url-1.26.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:023c8f520ba3a2a7c389f1205d4b2a9384bd06c8cf8b48ae58c43cdb4cfa1881"}, + {file = "ada_url-1.26.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:6e8db691157ada513c5e877fd66f0cea54ef473fcf7e6bad429608f2c32d5d63"}, + {file = "ada_url-1.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c158ae6850b1ac66c1dbd54a7b5dac5a2a953ca33db0cd6bcef1c97b1b5536de"}, + {file = "ada_url-1.26.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc723bf495730c22ec2890b8e5d4bbe591b73e97af6e8a862e0ca44ac4197660"}, + {file = "ada_url-1.26.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd375e12247a1d6ca190a67bc88463b60c013361d3f99e2347f8a7af2f548a1c"}, + {file = "ada_url-1.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:da783beac508b487d1c09a2afa35e3e14e39f164dd2c4a2d91db16ac63cfe65d"}, + {file = "ada_url-1.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:01e9e18dad01adc4703ffda5600c5ae0e5da547124e4ae0a74b0d30cdcf952b1"}, + {file = "ada_url-1.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:bbc9c955a37c15984495d487a9e1b5ff8aa681101cd3f087faab30fab03d53c8"}, + {file = "ada_url-1.26.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:e2a9fa9293f0137b04c1804fa357e906401977111cc8f7da2aa0e4971d152455"}, + {file = "ada_url-1.26.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:8678a5303a6d21d4c7639e8cb7d236f21a43615705ec841c2e0201a9c295de09"}, + {file = "ada_url-1.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf74c390d3ba9d264521d60e6c4a211aae9dbc5fd324c80bec8bfd5eea228347"}, + {file = "ada_url-1.26.0-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a7db1d9356dfaf3d69e8fe052ea2f301044b2ec111f050a16ea49ea53645f1"}, + {file = "ada_url-1.26.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2558db19ac40b1cd4d936b57724442a3340e4cd7b9ef55fa9b793fef525a12d7"}, + {file = "ada_url-1.26.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28542b0b958b75f5ce6cf3121f43eeb3884d29b6e873d5aad70c9a4807938178"}, + {file = "ada_url-1.26.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d60751f85392c2e1b610fb1799b6ec496e64b6c7072bac307c7109813da5745"}, + {file = "ada_url-1.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:3851518c53c8b5b2c2fb75a3571987f5669d2f37f7fe81e28e6080d42079f6e2"}, + {file = "ada_url-1.26.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:09ea872cc1d064123586ca3c0f934daf6d2bf0ed92dfdbebf166268ec1952595"}, + {file = "ada_url-1.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b2df12d04f5a57d17175182fb631cc1c21b21d6a1174fc1dee26c9978cec39b"}, + {file = "ada_url-1.26.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc6d6ce54384cae19c599b4464c391ad5208f244c885cf150957aeec81102bb7"}, + {file = "ada_url-1.26.0-pp310-pypy310_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c6f15abd4204760419683b7457ffbc4a71c86383b10273454db4773ad3e763c"}, + {file = "ada_url-1.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9c5018f739e2ddb092cd0f2a2a8ee0125bbf101ac93b1cbc762988b4515b1672"}, + {file = "ada_url-1.26.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:476b5ff71d89ce07ddc8d059c404f754582ad66946f6eb4ebb8a3162c917bc79"}, + {file = "ada_url-1.26.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:8d9e4fdc053711d42bb1ca3a1d1b201fa4628b6fdc8c65bdf158e9ec3ad1be0a"}, + {file = "ada_url-1.26.0-pp39-pypy39_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80bee51c57e53b878c1855b4c97c4037d5d1d35f83ade0f3664e82f2e9259ca3"}, + {file = "ada_url-1.26.0-pp39-pypy39_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e666ea81c54d8c705fa6262ef502fa483d6ca48727c6340f488f98d1d4716147"}, + {file = "ada_url-1.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d4e1a6d4d60d3603233b4dd6c3e461d25768d7127c346fc6dcd83920a619500e"}, + {file = "ada_url-1.26.0.tar.gz", hash = "sha256:87988926d78a68bc08de0595362163fa3d3126bf9e0223aaf9d98272de2625f4"}, +] + +[package.dependencies] +cffi = "*" [[package]] name = "annotated-types" version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" +category = "main" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -16,9 +80,9 @@ files = [ name = "anyio" version = "4.9.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, @@ -32,22 +96,23 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] +test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] name = "auth0-api-python" -version = "1.0.0b3" +version = "1.0.0b5" description = "SDK for verifying access tokens and securing APIs with Auth0, using Authlib." +category = "main" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ - {file = "auth0_api_python-1.0.0b3-py3-none-any.whl", hash = "sha256:b85325d416ac027b36b2ea3eb64e440e2986460b3ec8c88163724ce29ebe4735"}, - {file = "auth0_api_python-1.0.0b3.tar.gz", hash = "sha256:c437ba001768a124a3742294b853a0d751fe68a1a77c2ee7901ef0dd0c921e8b"}, + {file = "auth0_api_python-1.0.0b5-py3-none-any.whl", hash = "sha256:e553a4a8d7cc30a5e5358725c9de933d575f40398b12a6f244e9f8ba09d129d8"}, + {file = "auth0_api_python-1.0.0b5.tar.gz", hash = "sha256:0cba73036148cbfba84f1de9d235ef6b0e75a759a4b1f78329130713af655690"}, ] [package.dependencies] +ada-url = ">=1.25.0,<2.0.0" authlib = ">=1.0,<2.0" httpx = ">=0.28.1,<0.29.0" requests = ">=2.31.0,<3.0.0" @@ -56,9 +121,9 @@ requests = ">=2.31.0,<3.0.0" name = "authlib" version = "1.5.2" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." +category = "main" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "authlib-1.5.2-py2.py3-none-any.whl", hash = "sha256:8804dd4402ac5e4a0435ac49e0b6e19e395357cfa632a3f624dcb4f6df13b4b1"}, {file = "authlib-1.5.2.tar.gz", hash = "sha256:fe85ec7e50c5f86f1e2603518bb3b4f632985eb4a355e52256530790e326c512"}, @@ -71,10 +136,9 @@ cryptography = "*" name = "backports-tarfile" version = "1.2.0" description = "Backport of CPython tarfile module" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -88,9 +152,9 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch name = "certifi" version = "2025.4.26" description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, @@ -100,9 +164,9 @@ files = [ name = "cffi" version = "1.17.1" description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -172,7 +236,6 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "platform_python_implementation != \"PyPy\"", dev = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\" and platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -181,9 +244,9 @@ pycparser = "*" name = "charset-normalizer" version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -283,9 +346,9 @@ files = [ name = "click" version = "8.1.8" description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -298,22 +361,21 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} [[package]] name = "coverage" version = "7.8.0" description = "Code coverage measurement for Python" +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"}, {file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"}, @@ -384,15 +446,15 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli ; python_full_version <= \"3.11.0a6\""] +toml = ["tomli"] [[package]] name = "cryptography" version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -422,7 +484,6 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {dev = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -441,9 +502,9 @@ test-randomorder = ["pytest-randomly"] name = "docutils" version = "0.21.2" description = "Docutils -- Python Documentation Utilities" +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -453,10 +514,9 @@ files = [ name = "exceptiongroup" version = "1.2.2" description = "Backport of PEP 654 (exception groups)" +category = "main" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] -markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -469,9 +529,9 @@ test = ["pytest (>=6)"] name = "fastapi" version = "0.115.12" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d"}, {file = "fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681"}, @@ -490,9 +550,9 @@ standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "htt name = "h11" version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -502,9 +562,9 @@ files = [ name = "httpcore" version = "1.0.9" description = "A minimal low-level HTTP client." +category = "main" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -517,16 +577,16 @@ h11 = ">=0.16" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" version = "0.28.1" description = "The next generation HTTP client." +category = "main" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -535,23 +595,23 @@ files = [ [package.dependencies] anyio = "*" certifi = "*" -httpcore = "==1.*" +httpcore = ">=1.0.0,<2.0.0" idna = "*" [package.extras] -brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "id" version = "1.5.0" description = "A tool for generating OIDC identities" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"}, {file = "id-1.5.0.tar.gz", hash = "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d"}, @@ -569,9 +629,9 @@ test = ["coverage[toml]", "pretend", "pytest", "pytest-cov"] name = "idna" version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -584,10 +644,9 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 name = "importlib-metadata" version = "8.7.0" description = "Read metadata from Python packages" +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\" or python_version == \"3.9\"" files = [ {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, @@ -597,21 +656,21 @@ files = [ zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] name = "iniconfig" version = "2.1.0" description = "brain-dead simple config-ini parsing" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -621,10 +680,9 @@ files = [ name = "jaraco-classes" version = "3.4.0" description = "Utility functions for Python class constructs" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -641,10 +699,9 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena name = "jaraco-context" version = "6.0.1" description = "Useful decorators and context managers" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -655,16 +712,15 @@ files = [ [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jaraco-functools" version = "4.1.0" description = "Functools like those found in stdlib" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -674,7 +730,7 @@ files = [ more-itertools = "*" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -685,27 +741,25 @@ type = ["pytest-mypy"] name = "jeepney" version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" files = [ {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] -test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] trio = ["trio"] [[package]] name = "keyring" version = "25.6.0" description = "Store and access your passwords safely." +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -721,7 +775,7 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] @@ -733,9 +787,9 @@ type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -758,9 +812,9 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" +category = "dev" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -770,10 +824,9 @@ files = [ name = "more-itertools" version = "10.7.0" description = "More routines for operating on iterables, beyond itertools" +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, @@ -783,9 +836,9 @@ files = [ name = "nh3" version = "0.2.21" description = "Python binding to Ammonia HTML sanitizer Rust crate" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"}, {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"}, @@ -817,9 +870,9 @@ files = [ name = "packaging" version = "25.0" description = "Core utilities for Python packages" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -829,9 +882,9 @@ files = [ name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -845,22 +898,21 @@ testing = ["pytest", "pytest-benchmark"] name = "pycparser" version = "2.22" description = "C parser in Python" +category = "main" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "platform_python_implementation != \"PyPy\"", dev = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" version = "2.11.3" description = "Data validation using Python type hints" +category = "main" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f"}, {file = "pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3"}, @@ -874,15 +926,15 @@ typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] +timezone = ["tzdata"] [[package]] name = "pydantic-core" version = "2.33.1" description = "Core functionality for Pydantic validation and serialization" +category = "main" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26"}, {file = "pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927"}, @@ -992,9 +1044,9 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" name = "pygments" version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -1007,9 +1059,9 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pytest" version = "8.3.5" description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, @@ -1030,9 +1082,9 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments name = "pytest-asyncio" version = "0.20.3" description = "Pytest support for asyncio" +category = "dev" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-asyncio-0.20.3.tar.gz", hash = "sha256:83cbf01169ce3e8eb71c6c278ccb0574d1a7a3bb8eaaf5e50e0ad342afb33b36"}, {file = "pytest_asyncio-0.20.3-py3-none-any.whl", hash = "sha256:f129998b209d04fcc65c96fc85c11e5316738358909a8399e93be553d7656442"}, @@ -1049,9 +1101,9 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." +category = "dev" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, @@ -1068,28 +1120,28 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-httpx" version = "0.35.0" description = "Send responses to httpx." +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest_httpx-0.35.0-py3-none-any.whl", hash = "sha256:ee11a00ffcea94a5cbff47af2114d34c5b231c326902458deed73f9c459fd744"}, {file = "pytest_httpx-0.35.0.tar.gz", hash = "sha256:d619ad5d2e67734abfbb224c3d9025d64795d4b8711116b1a13f72a251ae511f"}, ] [package.dependencies] -httpx = "==0.28.*" -pytest = "==8.*" +httpx = ">=0.28.0,<0.29.0" +pytest = ">=8.0.0,<9.0.0" [package.extras] -testing = ["pytest-asyncio (==0.24.*)", "pytest-cov (==6.*)"] +testing = ["pytest-asyncio (>=0.24.0,<0.25.0)", "pytest-cov (>=6.0.0,<7.0.0)"] [[package]] name = "pytest-mock" version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -1105,10 +1157,9 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] name = "pywin32-ctypes" version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +category = "dev" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -1118,9 +1169,9 @@ files = [ name = "readme-renderer" version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, @@ -1138,9 +1189,9 @@ md = ["cmarkgfm (>=0.8.0)"] name = "requests" version = "2.32.3" description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -1160,9 +1211,9 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-toolbelt" version = "1.0.0" description = "A utility belt for advanced users of python-requests" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -1175,9 +1226,9 @@ requests = ">=2.0.1,<3.0.0" name = "rfc3986" version = "2.0.0" description = "Validating URI References per RFC 3986" +category = "dev" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -1190,9 +1241,9 @@ idna2008 = ["idna"] name = "rich" version = "14.0.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "dev" optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, @@ -1210,10 +1261,9 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "secretstorage" version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -1227,9 +1277,9 @@ jeepney = ">=0.6" name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" +category = "main" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1239,9 +1289,9 @@ files = [ name = "starlette" version = "0.46.2" description = "The little ASGI library that shines." +category = "main" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, @@ -1258,10 +1308,9 @@ full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart name = "tomli" version = "2.2.1" description = "A lil' TOML parser" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -1301,9 +1350,9 @@ files = [ name = "twine" version = "6.1.0" description = "Collection of utilities for publishing packages on PyPI" +category = "dev" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "twine-6.1.0-py3-none-any.whl", hash = "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384"}, {file = "twine-6.1.0.tar.gz", hash = "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd"}, @@ -1328,22 +1377,21 @@ keyring = ["keyring (>=15.1)"] name = "typing-extensions" version = "4.13.2" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, ] -markers = {dev = "python_version < \"3.13\""} [[package]] name = "typing-inspection" version = "0.4.0" description = "Runtime typing introspection tools" +category = "main" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, @@ -1356,16 +1404,16 @@ typing-extensions = ">=4.12.0" name = "urllib3" version = "2.4.0" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -1374,9 +1422,9 @@ zstd = ["zstandard (>=0.18.0)"] name = "uvicorn" version = "0.34.2" description = "The lightning-fast ASGI server." +category = "main" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403"}, {file = "uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328"}, @@ -1388,30 +1436,29 @@ h11 = ">=0.8" typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] -standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] +standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] name = "zipp" version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\" or python_version == \"3.9\"" files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = "^3.9" -content-hash = "f69f90a4e6a7029a0858e1c510a18ec4b248d66d9c1e7de85b2652250fa15366" +content-hash = "1de4de4fe1c78bd676192a0dd5ac0ef310000f46627731318a92dba95eb4a331" diff --git a/pyproject.toml b/pyproject.toml index 7548619..4707895 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.9" fastapi = "^0.115.11" httpx = "^0.28.1" uvicorn = "^0.34.0" -auth0-api-python = ">=1.0.0b3" +auth0-api-python = ">=1.0.0b5" [tool.poetry.group.dev.dependencies] pytest = "^8.0" diff --git a/requirements.txt b/requirements.txt index efcd6c2..390e21c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ annotated-types==0.7.0 anyio==4.9.0 -auth0-api-python==1.0.0b2 +auth0-api-python==1.0.0b5 Authlib==1.5.2 backports.tarfile==1.2.0 certifi==2025.4.26 diff --git a/tests/test_fast_api_client.py b/tests/test_fast_api_client.py index e2f4467..13800e9 100644 --- a/tests/test_fast_api_client.py +++ b/tests/test_fast_api_client.py @@ -314,3 +314,15 @@ async def test_route(claims=Depends(auth0.require_auth(scopes="valid"))): ) assert response.status_code == 403 +def test_auth0fastapi_accepts_client_id_and_secret(): + client_id = "test_client_id" + client_secret = "test_client_secret" + auth0 = Auth0FastAPI( + domain="auth0.local", + audience="test_audience", + client_id=client_id, + client_secret=client_secret + ) + options = auth0.api_client.options + assert options.client_id == client_id + assert options.client_secret == client_secret \ No newline at end of file