diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index d70a65e..9f4e6be 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -13,12 +13,12 @@ jobs: steps: - name: Git checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - name: Set up Python 3.13 - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.13" @@ -47,10 +47,10 @@ jobs: steps: - name: Git checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 87d59e6..26a2d06 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,9 +10,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.x" - name: Install pypa/build diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 1fd6af0..cf5d1a1 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -28,13 +28,13 @@ jobs: core.setOutput('base_ref', pr.data.base.ref); core.setOutput('head_sha', pr.data.head.sha); - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ steps.pr.outputs.head_sha }} fetch-depth: 0 - name: Set up Python 3.13 - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.13" diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 5b5caf0..53b4611 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -20,12 +20,12 @@ jobs: steps: - name: Git checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ github.event.inputs.python }} diff --git a/Pipfile b/Pipfile index 709c50e..0ba975b 100644 --- a/Pipfile +++ b/Pipfile @@ -4,13 +4,11 @@ verify_ssl = true name = "pypi" [packages] -requests = "==2.32.5" - -# Managed dependencies and security patches -urllib3 = ">=2.5.0" +httpx = {extras = ["http2"], version = "==0.28.1"} [dev-packages] -pytest = "==8.4.1" -pytest-cov = "==6.2.1" -responses = "==0.25.8" +pytest = "==8.4.2" +pytest-cov = "==7.0.0" +pytest-httpx = "==0.35.0" +typing-extensions = "4.15.0" switcher-client = {file = ".", editable = true} diff --git a/Pipfile.lock b/Pipfile.lock index 2871bb7..f54a9c9 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e448721c9d47614d23dde79507e3619cad88076113f423692c0420a34b165677" + "sha256": "011567ed49dce7f50cf64a9178fe7f3ce2740823981e6f8cb467ea75e938bb97" }, "pipfile-spec": 6, "requires": {}, @@ -14,6 +14,14 @@ ] }, "default": { + "anyio": { + "hashes": [ + "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", + "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1" + ], + "markers": "python_version >= '3.9'", + "version": "==4.10.0" + }, "certifi": { "hashes": [ "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", @@ -22,119 +30,83 @@ "markers": "python_version >= '3.7'", "version": "==2025.8.3" }, - "charset-normalizer": { + "h11": { "hashes": [ - "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", - "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", - "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", - "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", - "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", - "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", - "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", - "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", - "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", - "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", - "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", - "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", - "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", - "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", - "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", - "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", - "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", - "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", - "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", - "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", - "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", - "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", - "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", - "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", - "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", - "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", - "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", - "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", - "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", - "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", - "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", - "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", - "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", - "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", - "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", - "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", - "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", - "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", - "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", - "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", - "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", - "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", - "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", - "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", - "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", - "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", - "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", - "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", - "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", - "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", - "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", - "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", - "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", - "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", - "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", - "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", - "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", - "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", - "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", - "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", - "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", - "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", - "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", - "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", - "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", - "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", - "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", - "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", - "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", - "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", - "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", - "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", - "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", - "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", - "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", - "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", - "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", - "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", - "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9" + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" ], - "markers": "python_version >= '3.7'", - "version": "==3.4.3" + "markers": "python_version >= '3.8'", + "version": "==0.16.0" }, - "idna": { + "h2": { "hashes": [ - "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", + "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd" ], - "markers": "python_version >= '3.6'", - "version": "==3.10" + "markers": "python_version >= '3.9'", + "version": "==4.3.0" }, - "requests": { + "hpack": { "hashes": [ - "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", - "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf" + "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", + "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca" ], - "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.32.5" + "version": "==4.1.0" }, - "urllib3": { + "httpcore": { "hashes": [ - "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", - "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" + "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", + "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.9" + }, + "httpx": { + "extras": [ + "http2" + ], + "hashes": [ + "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", + "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + ], + "markers": "python_version >= '3.8'", + "version": "==0.28.1" + }, + "hyperframe": { + "hashes": [ + "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", + "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08" ], - "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.5.0" + "version": "==6.1.0" + }, + "idna": { + "hashes": [ + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + ], + "markers": "python_version >= '3.6'", + "version": "==3.10" + }, + "sniffio": { + "hashes": [ + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" } }, "develop": { + "anyio": { + "hashes": [ + "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", + "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1" + ], + "markers": "python_version >= '3.9'", + "version": "==4.10.0" + }, "certifi": { "hashes": [ "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", @@ -143,91 +115,6 @@ "markers": "python_version >= '3.7'", "version": "==2025.8.3" }, - "charset-normalizer": { - "hashes": [ - "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", - "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", - "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", - "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", - "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", - "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", - "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", - "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", - "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", - "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", - "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", - "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", - "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", - "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", - "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", - "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", - "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", - "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", - "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", - "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", - "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", - "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", - "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", - "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", - "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", - "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", - "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", - "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", - "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", - "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", - "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", - "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", - "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", - "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", - "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", - "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", - "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", - "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", - "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", - "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", - "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", - "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", - "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", - "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", - "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", - "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", - "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", - "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", - "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", - "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", - "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", - "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", - "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", - "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", - "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", - "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", - "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", - "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", - "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", - "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", - "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", - "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", - "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", - "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", - "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", - "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", - "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", - "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", - "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", - "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", - "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", - "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", - "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", - "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", - "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", - "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", - "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", - "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", - "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.3" - }, "colorama": { "hashes": [ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", @@ -241,97 +128,124 @@ "toml" ], "hashes": [ - "sha256:02252dc1216e512a9311f596b3169fad54abcb13827a8d76d5630c798a50a754", - "sha256:02650a11324b80057b8c9c29487020073d5e98a498f1857f37e3f9b6ea1b2426", - "sha256:03f47dc870eec0367fcdd603ca6a01517d2504e83dc18dbfafae37faec66129a", - "sha256:0520dff502da5e09d0d20781df74d8189ab334a1e40d5bafe2efaa4158e2d9e7", - "sha256:0666cf3d2c1626b5a3463fd5b05f5e21f99e6aec40a3192eee4d07a15970b07f", - "sha256:0913dd1613a33b13c4f84aa6e3f4198c1a21ee28ccb4f674985c1f22109f0aae", - "sha256:0be24d35e4db1d23d0db5c0f6a74a962e2ec83c426b5cac09f4234aadef38e4a", - "sha256:0d511dda38595b2b6934c2b730a1fd57a3635c6aa2a04cb74714cdfdd53846f4", - "sha256:146fa1531973d38ab4b689bc764592fe6c2f913e7e80a39e7eeafd11f0ef6db2", - "sha256:14d6071c51ad0f703d6440827eaa46386169b5fdced42631d5a5ac419616046f", - "sha256:1b7181c0feeb06ed8a02da02792f42f829a7b29990fef52eff257fef0885d760", - "sha256:1d043a8a06987cc0c98516e57c4d3fc2c1591364831e9deb59c9e1b4937e8caf", - "sha256:1f64b8d3415d60f24b058b58d859e9512624bdfa57a2d1f8aff93c1ec45c429b", - "sha256:1f672efc0731a6846b157389b6e6d5d5e9e59d1d1a23a5c66a99fd58339914d5", - "sha256:1f8a81b0614642f91c9effd53eec284f965577591f51f547a1cbeb32035b4c2f", - "sha256:2285c04ee8676f7938b02b4936d9b9b672064daab3187c20f73a55f3d70e6b4a", - "sha256:2968647e3ed5a6c019a419264386b013979ff1fb67dd11f5c9886c43d6a31fc2", - "sha256:2b96bfdf7c0ea9faebce088a3ecb2382819da4fbc05c7b80040dbc428df6af44", - "sha256:2d1b73023854068c44b0c554578a4e1ef1b050ed07cf8b431549e624a29a66ee", - "sha256:2d488d7d42b6ded7ea0704884f89dcabd2619505457de8fc9a6011c62106f6e5", - "sha256:32ddaa3b2c509778ed5373b177eb2bf5662405493baeff52278a0b4f9415188b", - "sha256:343a023193f04d46edc46b2616cdbee68c94dd10208ecd3adc56fcc54ef2baa1", - "sha256:36d42b7396b605f774d4372dd9c49bed71cbabce4ae1ccd074d155709dd8f235", - "sha256:384b34482272e960c438703cafe63316dfbea124ac62006a455c8410bf2a2262", - "sha256:3876385722e335d6e991c430302c24251ef9c2a9701b2b390f5473199b1b8ebf", - "sha256:38a9109c4ee8135d5df5505384fc2f20287a47ccbe0b3f04c53c9a1989c2bbaf", - "sha256:3f39cef43d08049e8afc1fde4a5da8510fc6be843f8dea350ee46e2a26b2f54c", - "sha256:4028e7558e268dd8bcf4d9484aad393cafa654c24b4885f6f9474bf53183a82a", - "sha256:414a568cd545f9dc75f0686a0049393de8098414b58ea071e03395505b73d7a8", - "sha256:42144e8e346de44a6f1dbd0a56575dd8ab8dfa7e9007da02ea5b1c30ab33a7db", - "sha256:44d43de99a9d90b20e0163f9770542357f58860a26e24dc1d924643bd6aa7cb4", - "sha256:467dc74bd0a1a7de2bedf8deaf6811f43602cb532bd34d81ffd6038d6d8abe99", - "sha256:5255b3bbcc1d32a4069d6403820ac8e6dbcc1d68cb28a60a1ebf17e47028e898", - "sha256:54a1532c8a642d8cc0bd5a9a51f5a9dcc440294fd06e9dda55e743c5ec1a8f14", - "sha256:556d23d4e6393ca898b2e63a5bca91e9ac2d5fb13299ec286cd69a09a7187fde", - "sha256:5661bf987d91ec756a47c7e5df4fbcb949f39e32f9334ccd3f43233bbb65e508", - "sha256:585ffe93ae5894d1ebdee69fc0b0d4b7c75d8007983692fb300ac98eed146f78", - "sha256:5e78bd9cf65da4c303bf663de0d73bf69f81e878bf72a94e9af67137c69b9fe9", - "sha256:5f1dc8f1980a272ad4a6c84cba7981792344dad33bf5869361576b7aef42733a", - "sha256:6013a37b8a4854c478d3219ee8bc2392dea51602dd0803a12d6f6182a0061762", - "sha256:609b60d123fc2cc63ccee6d17e4676699075db72d14ac3c107cc4976d516f2df", - "sha256:61f78c7c3bc272a410c5ae3fde7792b4ffb4acc03d35a7df73ca8978826bb7ab", - "sha256:62835c1b00c4a4ace24c1a88561a5a59b612fbb83a525d1c70ff5720c97c0610", - "sha256:63d4bb2966d6f5f705a6b0c6784c8969c468dbc4bcf9d9ded8bff1c7e092451f", - "sha256:63df1fdaffa42d914d5c4d293e838937638bf75c794cf20bee12978fc8c4e3bc", - "sha256:66c644cbd7aed8fe266d5917e2c9f65458a51cfe5eeff9c05f15b335f697066e", - "sha256:672a6c1da5aea6c629819a0e1461e89d244f78d7b60c424ecf4f1f2556c041d8", - "sha256:68c5e0bc5f44f68053369fa0d94459c84548a77660a5f2561c5e5f1e3bed7031", - "sha256:6a29f8e0adb7f8c2b95fa2d4566a1d6e6722e0a637634c6563cb1ab844427dd9", - "sha256:6b87f1ad60b30bc3c43c66afa7db6b22a3109902e28c5094957626a0143a001f", - "sha256:73269df37883e02d460bee0cc16be90509faea1e3bd105d77360b512d5bb9c33", - "sha256:74d5b63fe3f5f5d372253a4ef92492c11a4305f3550631beaa432fc9df16fcff", - "sha256:7e78b767da8b5fc5b2faa69bb001edafcd6f3995b42a331c53ef9572c55ceb82", - "sha256:7fa22800f3908df31cea6fb230f20ac49e343515d968cc3a42b30d5c3ebf9b5a", - "sha256:8002dc6a049aac0e81ecec97abfb08c01ef0c1fbf962d0c98da3950ace89b869", - "sha256:8048ce4b149c93447a55d279078c8ae98b08a6951a3c4d2d7e87f4efc7bfe100", - "sha256:90dc3d6fb222b194a5de60af8d190bedeeddcbc7add317e4a3cd333ee6b7c879", - "sha256:9a86281794a393513cf117177fd39c796b3f8e3759bb2764259a2abba5cce54b", - "sha256:a46473129244db42a720439a26984f8c6f834762fc4573616c1f37f13994b357", - "sha256:a931a87e5ddb6b6404e65443b742cb1c14959622777f2a4efd81fba84f5d91ba", - "sha256:ad8fa9d5193bafcf668231294241302b5e683a0518bf1e33a9a0dfb142ec3031", - "sha256:b08801e25e3b4526ef9ced1aa29344131a8f5213c60c03c18fe4c6170ffa2874", - "sha256:b0ef4e66f006ed181df29b59921bd8fc7ed7cd6a9289295cd8b2824b49b570df", - "sha256:b3dcf2ead47fa8be14224ee817dfc1df98043af568fe120a22f81c0eb3c34ad2", - "sha256:b45264dd450a10f9e03237b41a9a24e85cbb1e278e5a32adb1a303f58f0017f3", - "sha256:b4fdc777e05c4940b297bf47bf7eedd56a39a61dc23ba798e4b830d585486ca5", - "sha256:bc85eb2d35e760120540afddd3044a5bf69118a91a296a8b3940dfc4fdcfe1e2", - "sha256:bc8e4d99ce82f1710cc3c125adc30fd1487d3cf6c2cd4994d78d68a47b16989a", - "sha256:c177e6ffe2ebc7c410785307758ee21258aa8e8092b44d09a2da767834f075f2", - "sha256:c2492e4dd9daab63f5f56286f8a04c51323d237631eb98505d87e4c4ff19ec34", - "sha256:c2d05c7e73c60a4cecc7d9b60dbfd603b4ebc0adafaef371445b47d0f805c8a9", - "sha256:c6a5c3414bfc7451b879141ce772c546985163cf553f08e0f135f0699a911801", - "sha256:cebd8e906eb98bb09c10d1feed16096700b1198d482267f8bf0474e63a7b8d84", - "sha256:cf33134ffae93865e32e1e37df043bef15a5e857d8caebc0099d225c579b0fa3", - "sha256:d9cd64aca68f503ed3f1f18c7c9174cbb797baba02ca8ab5112f9d1c0328cd4b", - "sha256:dd382410039fe062097aa0292ab6335a3f1e7af7bba2ef8d27dcda484918f20c", - "sha256:e551f9d03347196271935fd3c0c165f0e8c049220280c1120de0084d65e9c7ff", - "sha256:eb7b0bbf7cc1d0453b843eca7b5fa017874735bef9bfdfa4121373d2cc885ed6", - "sha256:eb90fe20db9c3d930fa2ad7a308207ab5b86bf6a76f54ab6a40be4012d88fcae", - "sha256:ed9749bb8eda35f8b636fb7632f1c62f735a236a5d4edadd8bbcc5ea0542e732", - "sha256:ef3b83594d933020f54cf65ea1f4405d1f4e41a009c46df629dd964fcb6e907c", - "sha256:f2e57716a78bc3ae80b2207be0709a3b2b63b9f2dcf9740ee6ac03588a2015b6", - "sha256:f366a57ac81f5e12797136552f5b7502fa053c861a009b91b80ed51f2ce651c6", - "sha256:f39071caa126f69d63f99b324fb08c7b1da2ec28cbb1fe7b5b1799926492f65c", - "sha256:f4446a9547681533c8fa3e3c6cf62121eeee616e6a92bd9201c6edd91beffe13", - "sha256:f9559b906a100029274448f4c8b8b0a127daa4dade5661dfd821b8c188058842", - "sha256:fcf6ab569436b4a647d4e91accba12509ad9f2554bc93d3aee23cc596e7f99c3", - "sha256:fefafcca09c3ac56372ef64a40f5fe17c5592fab906e0fdffd09543f3012ba50" + "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930", + "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747", + "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65", + "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7", + "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27", + "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034", + "sha256:10356fdd33a7cc06e8051413140bbdc6f972137508a3572e3f59f805cd2832fd", + "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b", + "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e", + "sha256:2195f8e16ba1a44651ca684db2ea2b2d4b5345da12f07d9c22a395202a05b23c", + "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5", + "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc", + "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5", + "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5", + "sha256:2e4c33e6378b9d52d3454bd08847a8651f4ed23ddbb4a0520227bd346382bbc6", + "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634", + "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003", + "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b", + "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7", + "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb", + "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619", + "sha256:5b15a87265e96307482746d86995f4bff282f14b027db75469c446da6127433b", + "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea", + "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb", + "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e", + "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc", + "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32", + "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb", + "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a", + "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282", + "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5", + "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5", + "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6", + "sha256:70e7bfbd57126b5554aa482691145f798d7df77489a177a6bef80de78860a356", + "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a", + "sha256:7d79dabc0a56f5af990cc6da9ad1e40766e82773c075f09cc571e2076fef882e", + "sha256:7eb68d356ba0cc158ca535ce1381dbf2037fa8cb5b1ae5ddfc302e7317d04144", + "sha256:80b1695cf7c5ebe7b44bf2521221b9bb8cdf69b1f24231149a7e3eb1ae5fa2fb", + "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4", + "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629", + "sha256:86b9b59f2b16e981906e9d6383eb6446d5b46c278460ae2c36487667717eccf1", + "sha256:8953746d371e5695405806c46d705a3cd170b9cc2b9f93953ad838f6c1e58612", + "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972", + "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393", + "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc", + "sha256:90558c35af64971d65fbd935c32010f9a2f52776103a259f1dee865fe8259352", + "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6", + "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0", + "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3", + "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80", + "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9", + "sha256:9702b59d582ff1e184945d8b501ffdd08d2cee38d93a2206aa5f1365ce0b8d78", + "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0", + "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a", + "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c", + "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d", + "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32", + "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0", + "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80", + "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713", + "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27", + "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153", + "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c", + "sha256:c61fc91ab80b23f5fddbee342d19662f3d3328173229caded831aa0bd7595460", + "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1", + "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f", + "sha256:c83f6afb480eae0313114297d29d7c295670a41c11b274e6bca0c64540c1ce7b", + "sha256:c8a3ec16e34ef980a46f60dc6ad86ec60f763c3f2fa0db6d261e6e754f72e945", + "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b", + "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a", + "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df", + "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d", + "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21", + "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4", + "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2", + "sha256:e132b9152749bd33534e5bd8565c7576f135f157b4029b975e15ee184325f528", + "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba", + "sha256:e41be6f0f19da64af13403e52f2dec38bbc2937af54df8ecef10850ff8d35301", + "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62", + "sha256:efeda443000aa23f276f4df973cb82beca682fd800bb119d19e80504ffe53ec2", + "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d", + "sha256:f32ff80e7ef6a5b5b606ea69a36e97b219cd9dc799bcf2963018a4d8f788cfbf", + "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e", + "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90", + "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e", + "sha256:fc53ba868875bfbb66ee447d64d6413c2db91fddcfca57025a0e7ab5b07d5862", + "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5", + "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6" ], "markers": "python_version >= '3.9'", - "version": "==7.10.5" + "version": "==7.10.6" + }, + "h11": { + "hashes": [ + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" + ], + "markers": "python_version >= '3.8'", + "version": "==0.16.0" + }, + "httpcore": { + "hashes": [ + "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", + "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.9" + }, + "httpx": { + "extras": [ + "http2" + ], + "hashes": [ + "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", + "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + ], + "markers": "python_version >= '3.8'", + "version": "==0.28.1" }, "idna": { "hashes": [ @@ -375,111 +289,51 @@ }, "pytest": { "hashes": [ - "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", - "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" + "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", + "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==8.4.1" + "version": "==8.4.2" }, "pytest-cov": { "hashes": [ - "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", - "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5" + "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", + "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==6.2.1" - }, - "pyyaml": { - "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.0.2" + "version": "==7.0.0" }, - "requests": { + "pytest-httpx": { "hashes": [ - "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", - "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf" + "sha256:d619ad5d2e67734abfbb224c3d9025d64795d4b8711116b1a13f72a251ae511f", + "sha256:ee11a00ffcea94a5cbff47af2114d34c5b231c326902458deed73f9c459fd744" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.32.5" + "version": "==0.35.0" }, - "responses": { + "sniffio": { "hashes": [ - "sha256:0c710af92def29c8352ceadff0c3fe340ace27cf5af1bbe46fb71275bcd2831c", - "sha256:9374d047a575c8f781b94454db5cab590b6029505f488d12899ddb10a4af1cf4" + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.25.8" + "markers": "python_version >= '3.7'", + "version": "==1.3.1" }, "switcher-client": { "editable": true, "file": "." }, - "urllib3": { + "typing-extensions": { "hashes": [ - "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", - "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" + "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", + "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.5.0" + "version": "==4.15.0" } } } diff --git a/README.md b/README.md index 2db37bd..ed1b165 100644 --- a/README.md +++ b/README.md @@ -219,4 +219,21 @@ Client.schedule_snapshot_auto_update(3000, { 'success': lambda updated: print('Snapshot updated', updated), 'reject': lambda err: print(err) }) -``` \ No newline at end of file +``` + +# Contributing +We welcome contributions to the Switcher Client SDK for Python! If you have suggestions, improvements, or bug fixes, please follow these steps: + +1. Fork the repository. +2. Create a new branch for your feature or bug fix. +3. Make your changes and commit them with clear messages. +4. Submit a pull request detailing your changes and the problem they solve. + +Thank you for helping us improve the Switcher Client SDK! + +### Requirements +- Python 3.9 or higher +- Virtualenv - `pip install virtualenv` +- Create a virtual environment - `python3 -m venv .venv` +- Install Pipenv - `pip install pipenv` +- Check Makefile for all available commands \ No newline at end of file diff --git a/switcher_client/lib/remote.py b/switcher_client/lib/remote.py index 068b91a..f525ce1 100644 --- a/switcher_client/lib/remote.py +++ b/switcher_client/lib/remote.py @@ -1,5 +1,6 @@ import json -import requests +import httpx + from typing import Optional from switcher_client.errors import RemoteAuthError, RemoteError @@ -10,11 +11,12 @@ from switcher_client.switcher_data import SwitcherData class Remote: + _client: Optional[httpx.Client] = None @staticmethod def auth(context: Context): url = f'{context.url}/criteria/auth' - response = Remote.do_post(url, { + response = Remote.__do_post(url, { 'domain': context.domain, 'component': context.component, 'environment': context.environment, @@ -29,12 +31,10 @@ def auth(context: Context): raise RemoteAuthError('Invalid API key') @staticmethod - def check_criteria( - token: Optional[str], context: Context, switcher: SwitcherData) -> ResultDetail: - + def check_criteria(token: Optional[str], context: Context, switcher: SwitcherData) -> ResultDetail: url = f'{context.url}/criteria?showReason={str(switcher._show_details).lower()}&key={switcher._key}' entry = Remote.__get_entry(switcher._input) - response = Remote.do_post(url, entry, Remote.get_header(token)) + response = Remote.__do_post(url, entry, Remote.__get_header(token)) if response.status_code == 200: json_response = response.json() @@ -49,7 +49,7 @@ def check_criteria( @staticmethod def check_snapshot_version(token: Optional[str], context: Context, snapshot_version: int) -> bool: url = f'{context.url}/criteria/snapshot_check/{snapshot_version}' - response = Remote.do_get(url, Remote.get_header(token)) + response = Remote.__do_get(url, Remote.__get_header(token)) if response.status_code == 200: return response.json().get('status', False) @@ -79,23 +79,39 @@ def resolve_snapshot(token: Optional[str], context: Context) -> str | None: """ } - response = Remote.do_post(f'{context.url}/graphql', data, Remote.get_header(token)) + response = Remote.__do_post(f'{context.url}/graphql', data, Remote.__get_header(token)) if response.status_code == 200: return json.dumps(response.json(), indent=4) raise RemoteError(f'[resolve_snapshot] failed with status: {response.status_code}') + @classmethod + def __get_client(cls) -> httpx.Client: + if cls._client is None or cls._client.is_closed: + cls._client = httpx.Client( + timeout=30.0, + limits=httpx.Limits( + max_keepalive_connections=20, + max_connections=100, + keepalive_expiry=30.0 + ), + http2=True + ) + return cls._client + @staticmethod - def do_post(url, data, headers) -> requests.Response: - return requests.post(url, json=data, headers=headers) + def __do_post(url, data, headers) -> httpx.Response: + client = Remote.__get_client() + return client.post(url, json=data, headers=headers) @staticmethod - def do_get(url, headers=None) -> requests.Response: - return requests.get(url, headers=headers) + def __do_get(url, headers=None) -> httpx.Response: + client = Remote.__get_client() + return client.get(url, headers=headers) @staticmethod - def get_header(token: Optional[str]): + def __get_header(token: Optional[str]): return { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json', diff --git a/tests/test_client_load_snapshot_remote.py b/tests/test_client_load_snapshot_remote.py index eb86898..4df2d0f 100644 --- a/tests/test_client_load_snapshot_remote.py +++ b/tests/test_client_load_snapshot_remote.py @@ -1,22 +1,22 @@ import json import pytest -import responses import time + from typing import Optional +from pytest_httpx import HTTPXMock from switcher_client import Client from switcher_client.errors import RemoteError from switcher_client.lib.globals.global_context import DEFAULT_ENVIRONMENT, ContextOptions from switcher_client.lib.globals.global_snapshot import LoadSnapshotOptions -@responses.activate -def test_load_from_snapshot_in_memory(): +def test_load_from_snapshot_in_memory(httpx_mock): """ Should load in-memory Domain from snapshot remote """ # given - given_auth() - given_check_snapshot_version(version=0, status=False) - given_resolve_snapshot(data=load_snapshot_fixture('tests/snapshots/default_load_1.json')) + given_auth(httpx_mock) + given_check_snapshot_version(httpx_mock, version=0, status=False) + given_resolve_snapshot(httpx_mock, data=load_snapshot_fixture('tests/snapshots/default_load_1.json')) given_context(environment='default_load_1') # test @@ -27,13 +27,12 @@ def test_load_from_snapshot_in_memory(): assert Client.snapshot_version() == 1588557288040 assert version == Client.snapshot_version() -@responses.activate -def test_load_from_snapshot_no_update(): +def test_load_from_snapshot_no_update(httpx_mock): """ Should not update snapshot if version is the same """ # given - given_auth() - given_check_snapshot_version(version=1588557288040, status=True) + given_auth(httpx_mock) + given_check_snapshot_version(httpx_mock, version=1588557288040, status=True) given_context(snapshot_location='tests/snapshots', environment='default_load_1') # test @@ -44,13 +43,12 @@ def test_load_from_snapshot_no_update(): assert version == Client.snapshot_version() assert not updated -@responses.activate -def test_check_snapshot_version_error(): +def test_check_snapshot_version_error(httpx_mock): """ Should handle errors when checking snapshot version """ # given - given_auth() - given_check_snapshot_version(status_code=500, version=1588557288040) + given_auth(httpx_mock) + given_check_snapshot_version(httpx_mock, status_code=500, version=1588557288040) given_context(snapshot_location='tests/snapshots', environment='default_load_1') Client.load_snapshot() # load from file @@ -61,14 +59,13 @@ def test_check_snapshot_version_error(): assert '[check_snapshot_version] failed with status: 500' in str(excinfo.value) -@responses.activate -def test_resolve_snapshot_error(): +def test_resolve_snapshot_error(httpx_mock): """ Should handle errors when resolving snapshot """ # given - given_auth() - given_check_snapshot_version(version=1588557288040, status=False) - given_resolve_snapshot(status_code=500) + given_auth(httpx_mock) + given_check_snapshot_version(httpx_mock, version=1588557288040, status=False) + given_resolve_snapshot(httpx_mock, status_code=500) given_context(snapshot_location='tests/snapshots', environment='default_load_1') Client.load_snapshot() # load from file @@ -81,28 +78,28 @@ def test_resolve_snapshot_error(): # Helpers -def given_auth(status=200, token: Optional[str]='[token]', exp=int(round(time.time() * 1000))): - responses.add( - responses.POST, - 'https://api.switcherapi.com/criteria/auth', - json={'token': token, 'exp': exp}, - status=status +def given_auth(httpx_mock: HTTPXMock, status=200, token: Optional[str]='[token]', exp=int(round(time.time() * 1000))): + httpx_mock.add_response( + url='https://api.switcherapi.com/criteria/auth', + method='POST', + status_code=status, + json={'token': token, 'exp': exp} ) -def given_check_snapshot_version(status_code=200, version=0, status=False): - responses.add( - responses.GET, - f'https://api.switcherapi.com/criteria/snapshot_check/{version}', - json={'status': status}, - status=status_code +def given_check_snapshot_version(httpx_mock: HTTPXMock, status_code=200, version=0, status=False): + httpx_mock.add_response( + url=f'https://api.switcherapi.com/criteria/snapshot_check/{version}', + method='GET', + status_code=status_code, + json={'status': status} ) -def given_resolve_snapshot(status_code=200, data=[]): - responses.add( - responses.POST, - 'https://api.switcherapi.com/graphql', - json={'data': data}, - status=status_code +def given_resolve_snapshot(httpx_mock: HTTPXMock, status_code=200, data=[]): + httpx_mock.add_response( + url='https://api.switcherapi.com/graphql', + method='POST', + status_code=status_code, + json={'data': data} ) def given_context(url='https://api.switcherapi.com', @@ -113,7 +110,7 @@ def given_context(url='https://api.switcherapi.com', url=url, api_key=api_key, domain='Switcher API', - component='switcher4deno', + component='switcher-client-python', environment=environment, options=ContextOptions( local=True, diff --git a/tests/test_switcher_remote.py b/tests/test_switcher_remote.py index e5da839..0d35414 100644 --- a/tests/test_switcher_remote.py +++ b/tests/test_switcher_remote.py @@ -1,20 +1,19 @@ -from typing import Optional - import pytest -import responses import time +from typing import Optional +from pytest_httpx import HTTPXMock + from switcher_client.errors import RemoteAuthError from switcher_client import Client from switcher_client.lib.globals.global_auth import GlobalAuth -@responses.activate -def test_remote(): +def test_remote(httpx_mock): """ Should call the remote API with success """ # given - given_auth() - given_check_criteria(response={'result': True}) + given_auth(httpx_mock) + given_check_criteria(httpx_mock, response={'result': True}) given_context() switcher = Client.get_switcher() @@ -22,20 +21,17 @@ def test_remote(): # test assert switcher.is_on('MY_SWITCHER') -@responses.activate -def test_remote_with_input(): +def test_remote_with_input(httpx_mock): """ Should call the remote API with success using input parameters """ # given - given_auth() - given_check_criteria(response={'result': True}, match=[ - responses.matchers.json_params_matcher({ - 'entry': [{ - 'strategy': 'VALUE_VALIDATION', - 'input': 'user_id' - }] - }) - ]) + given_auth(httpx_mock) + given_check_criteria(httpx_mock, response={'result': True}, match={ + 'entry': [{ + 'strategy': 'VALUE_VALIDATION', + 'input': 'user_id' + }] + }) given_context() switcher = Client.get_switcher() @@ -45,20 +41,17 @@ def test_remote_with_input(): .check_value('user_id') \ .is_on('MY_SWITCHER') -@responses.activate -def test_remote_with_prepare(): +def test_remote_with_prepare(httpx_mock): """ Should prepare call the remote API with success """ # given - given_auth() - given_check_criteria(response={'result': True}, match=[ - responses.matchers.json_params_matcher({ - 'entry': [{ - 'strategy': 'VALUE_VALIDATION', - 'input': 'user_id' - }] - }) - ]) + given_auth(httpx_mock) + given_check_criteria(httpx_mock, response={'result': True}, match={ + 'entry': [{ + 'strategy': 'VALUE_VALIDATION', + 'input': 'user_id' + }] + }) given_context() switcher = Client.get_switcher() @@ -67,13 +60,13 @@ def test_remote_with_prepare(): switcher.check_value('user_id').prepare('MY_SWITCHER') assert switcher.is_on() -@responses.activate -def test_remote_with_details(): +def test_remote_with_details(httpx_mock): """ Should call the remote API with success using detailed response """ # given - given_auth() + given_auth(httpx_mock) given_check_criteria( + httpx_mock, response={ 'result': True, 'reason': 'Success', @@ -91,14 +84,13 @@ def test_remote_with_details(): assert response.result is True assert response.metadata == {'key': 'value'} -@responses.activate -def test_remote_renew_token(): +def test_remote_renew_token(httpx_mock): """ Should renew the token when it is expired """ # given - given_auth(status=200, token='[expired_token]', exp=int(round(time.time())) - 3600) - given_auth(status=200, token='[new_token]', exp=int(round(time.time())) + 3600) - given_check_criteria(response={'result': True}) + given_auth(httpx_mock, status=200, token='[expired_token]', exp=int(round(time.time())) - 3600) + given_auth(httpx_mock, status=200, token='[new_token]', exp=int(round(time.time())) + 3600) + given_check_criteria(httpx_mock, response={'result': True}) given_context() switcher = Client.get_switcher() @@ -109,12 +101,11 @@ def test_remote_renew_token(): switcher.is_on('MY_SWITCHER') assert GlobalAuth.get_token() == '[new_token]' -@responses.activate -def test_remote_err_no_key(): +def test_remote_err_no_key(httpx_mock): """ Should raise an exception when no key is provided """ # given - given_auth() + given_auth(httpx_mock) given_context() switcher = Client.get_switcher() @@ -125,12 +116,11 @@ def test_remote_err_no_key(): assert 'Missing key field' in str(excinfo.value) -@responses.activate -def test_remote_err_no_token(): +def test_remote_err_no_token(httpx_mock): """ Should raise an exception when no token is provided """ # given - given_auth(status=200, token=None) + given_auth(httpx_mock, status=200, token=None) given_context() switcher = Client.get_switcher() @@ -141,12 +131,11 @@ def test_remote_err_no_token(): assert 'Missing token field' in str(excinfo.value) -@responses.activate -def test_remote_err_invalid_api_key(): +def test_remote_err_invalid_api_key(httpx_mock): """ Should raise an exception when the API key is invalid """ # given - given_auth(status=401) + given_auth(httpx_mock, status=401) given_context() switcher = Client.get_switcher() @@ -157,13 +146,13 @@ def test_remote_err_invalid_api_key(): assert 'Invalid API key' in str(excinfo.value) -@responses.activate -def test_remote_err_check_criteria(): + +def test_remote_err_check_criteria(httpx_mock): """ Should raise an exception when the check criteria fails """ # given - given_auth() - given_check_criteria(status=500) + given_auth(httpx_mock) + given_check_criteria(httpx_mock, status=500) given_context() switcher = Client.get_switcher() @@ -184,19 +173,21 @@ def given_context(url='https://api.switcherapi.com', api_key='[API_KEY]'): component='switcher-playground' ) -def given_auth(status=200, token: Optional[str]='[token]', exp=int(round(time.time() * 1000))): - responses.add( - responses.POST, - 'https://api.switcherapi.com/criteria/auth', - json={'token': token, 'exp': exp}, - status=status +def given_auth(httpx_mock: HTTPXMock, status=200, token: Optional[str]='[token]', exp=int(round(time.time() * 1000))): + httpx_mock.add_response( + url='https://api.switcherapi.com/criteria/auth', + method='POST', + status_code=status, + json={'token': token, 'exp': exp} ) -def given_check_criteria(status=200, key='MY_SWITCHER', response={}, show_details=False, match=[]): - responses.add( - responses.POST, - f'https://api.switcherapi.com/criteria?showReason={str(show_details).lower()}&key={key}', +def given_check_criteria(httpx_mock: HTTPXMock, status=200, key='MY_SWITCHER', response={}, show_details=False, match=None): + httpx_mock.add_response( + is_reusable=True, + url=f'https://api.switcherapi.com/criteria?showReason={str(show_details).lower()}&key={key}', + method='POST', + status_code=status, json=response, - status=status, - match=match + match_json=match ) +