Skip to content

Commit 39c6feb

Browse files
committed
Merge branch 'feat/use-httpx' into feat/support-async
2 parents 9d6229e + 7d57d3a commit 39c6feb

File tree

12 files changed

+799
-70
lines changed

12 files changed

+799
-70
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
fail-fast: false
2121
matrix:
2222
py:
23+
- "3.13"
2324
- "3.12"
2425
- "3.11"
2526
- "3.10"

.gitleaksignore

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
04146e7a83d6212e407c5a46008324d646878fc1:tests/test_auth.py:jwt:257
2+
1c0c3ca7205fa8fa481b2bc90933d7d1f0400253:tests/test_descope_client.py:jwt:563
3+
1c0c3ca7205fa8fa481b2bc90933d7d1f0400253:tests/test_descope_client.py:jwt:571
4+
3ce967512fed2bae5e89dc9ff973e67ff9bc3084:tests/test_password.py:jwt:167
5+
3ce967512fed2bae5e89dc9ff973e67ff9bc3084:tests/test_password.py:jwt:313
6+
3ce967512fed2bae5e89dc9ff973e67ff9bc3084:tests/test_password.py:jwt:87
7+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_descope_client.py:jwt:122
8+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_descope_client.py:jwt:178
9+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_descope_client.py:jwt:248
10+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_descope_client.py:jwt:249
11+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_descope_client.py:jwt:250
12+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_descope_client.py:jwt:266
13+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_descope_client.py:jwt:267
14+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_magiclink.py:jwt:341
15+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_magiclink.py:jwt:356
16+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_otp.py:jwt:246
17+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_webauthn.py:jwt:127
18+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_webauthn.py:jwt:220
19+
602af9d1f4ce24799cfdcb06fc76eaedb39ba31c:tests/test_webauthn.py:jwt:326
20+
621149e12da145ea6c65ca5a0246ce5f93f9124e:tests/test_magiclink.py:jwt:253
21+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:606
22+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:607
23+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:632
24+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:648
25+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:649
26+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:723
27+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:724
28+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:742
29+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:779
30+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:780
31+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:781
32+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:796
33+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:797
34+
66ec16354a25b8d8d22de85ed823c5151fda0940:tests/test_auth.py:jwt:814
35+
6d4b1f4dbcbef45e4a5bdce952d8bc2bf5a8dd72:tests/test_enchantedlink.py:jwt:246
36+
6d4b1f4dbcbef45e4a5bdce952d8bc2bf5a8dd72:tests/test_enchantedlink.py:jwt:261
37+
71ba33c612675bd34fa7830c6b884f1f01efda9b:tests/test_oauth.py:jwt:102
38+
71ba33c612675bd34fa7830c6b884f1f01efda9b:tests/test_saml.py:jwt:84
39+
84adfdb469398f4b2263d0e57f8a16389227629d:tests/test_totp.py:jwt:106
40+
8e5937752bd25ae682e56f9f8e31ee537ea5479d:tests/test_auth.py:jwt:285
41+
8e5937752bd25ae682e56f9f8e31ee537ea5479d:tests/test_auth.py:jwt:312
42+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:152
43+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:153
44+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:174
45+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:211
46+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:212
47+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:213
48+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:228
49+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:229
50+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:76
51+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:77
52+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_descope_client.py:jwt:78
53+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_exchanger.py:jwt:45
54+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_magiclink.py:jwt:339
55+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_magiclink.py:jwt:351
56+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_otp.py:jwt:245
57+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_totp.py:jwt:109
58+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_totp.py:jwt:85
59+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_webauthn.py:jwt:127
60+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_webauthn.py:jwt:212
61+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_webauthn.py:jwt:230
62+
910e8e7d14b8c53e566a06c55abfb04b5a16cb72:tests/test_webauthn.py:jwt:318
63+
a753d819979a4864cf4df0226fa9c9a5d06424c9:tests/test_password.py:jwt:399
64+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:385
65+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:402
66+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:403
67+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:404
68+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:478
69+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:479
70+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:497
71+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:534
72+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:535
73+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:549
74+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:550
75+
a76d544894ddac33781df1f9d7e73de4200d177f:tests/test_auth.py:jwt:567
76+
ad14b0225444f72e8c46527d10acfd19dd6e9352:tests/test_oauth.py:jwt:137
77+
ad14b0225444f72e8c46527d10acfd19dd6e9352:tests/test_saml.py:jwt:131
78+
ad14b0225444f72e8c46527d10acfd19dd6e9352:tests/test_totp.py:jwt:87
79+
ad14b0225444f72e8c46527d10acfd19dd6e9352:tests/test_webauthn.py:jwt:317
80+
ad14b0225444f72e8c46527d10acfd19dd6e9352:tests/test_webauthn.py:jwt:483
81+
bc5a7d8928ba27f9eeb2e0e5ddfe925eb5fda5a7:tests/test_sso.py:jwt:128
82+
e5d19171d5d9e188f1d99369b408388c1032583f:tests/test_descope_client.py:jwt:700
83+
e7f5ad4253ad82236a5cff5f8c06878bfb190b00:tests/test_descope_client.py:jwt:171
84+
e7f5ad4253ad82236a5cff5f8c06878bfb190b00:tests/test_descope_client.py:jwt:185
85+
e7f5ad4253ad82236a5cff5f8c06878bfb190b00:tests/test_descope_client.py:jwt:197
86+
ece761372c78a9ad8a57da5f6d13431d298a99db:tests/test_auth.py:jwt:562
87+
f3ec873c83a7067a1226d8b712b756b1b599fb3b:tests/test_descope_client.py:jwt:519

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ repos:
2929
- id: pyupgrade
3030
args: [--py38-plus]
3131
- repo: https://github.com/pycqa/flake8
32-
rev: 7.2.0
32+
rev: 7.3.0
3333
hooks:
3434
- id: flake8
3535
additional_dependencies: [Flake8-pyproject]
@@ -52,7 +52,7 @@ repos:
5252
- id: tox-ini-fmt
5353
args: ["-p", "type"]
5454
- repo: https://github.com/gitleaks/gitleaks
55-
rev: v8.26.0
55+
rev: v8.27.2
5656
hooks:
5757
- id: gitleaks
5858
- repo: local

.vscode/settings.json

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
{
22
"python.testing.pytestEnabled": true,
3-
"python.testing.pytestArgs": ["tests"],
3+
"python.testing.pytestArgs": [
4+
"tests"
5+
],
46
"flake8.importStrategy": "fromEnvironment",
57
"mypy-type-checker.importStrategy": "fromEnvironment",
68
"isort.importStrategy": "fromEnvironment",
79
"black-formatter.importStrategy": "fromEnvironment",
8-
"workbench.colorCustomizations": {
9-
"activityBar.background": "#4D1C3B",
10-
"titleBar.activeBackground": "#6B2752",
11-
"titleBar.activeForeground": "#FDF8FB"
12-
}
13-
}
10+
"workbench.colorCustomizations": { /* do not change please... */}
11+
}

descope/flask/__init__.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import uuid
55
from functools import wraps
66

7-
from flask import Response, _request_ctx_stack, redirect, request
7+
from flask import Response, redirect, request, g
88

99
from .. import (
1010
COOKIE_DATA_NAME,
@@ -143,7 +143,7 @@ def decorated(*args, **kwargs):
143143
return Response("Access denied", 401)
144144

145145
# Save the claims on the context execute the original API
146-
_request_ctx_stack.top.claims = jwt_response
146+
g.claims = jwt_response
147147
response = f(*args, **kwargs)
148148

149149
if jwt_response.get(COOKIE_DATA_NAME, None):
@@ -181,7 +181,7 @@ def decorated(*args, **kwargs):
181181
return Response("Unauthorized", 401)
182182

183183
# Save the claims on the context execute the original API
184-
_request_ctx_stack.top.claims = jwt_response
184+
g.claims = jwt_response
185185
response = f(*args, **kwargs)
186186

187187
set_cookie_on_response(
@@ -194,7 +194,6 @@ def decorated(*args, **kwargs):
194194
jwt_response[REFRESH_SESSION_TOKEN_NAME],
195195
jwt_response[COOKIE_DATA_NAME],
196196
)
197-
198197
return response
199198

200199
return decorated
@@ -224,7 +223,7 @@ def decorated(*args, **kwargs):
224223
return Response("Unauthorized", 401)
225224

226225
# Save the claims on the context execute the original API
227-
_request_ctx_stack.top.claims = jwt_response
226+
g.claims = jwt_response
228227
response = f(*args, **kwargs)
229228

230229
set_cookie_on_response(
@@ -267,7 +266,7 @@ def decorated(*args, **kwargs):
267266
return Response("Unauthorized", 401)
268267

269268
# Save the claims on the context execute the original API
270-
_request_ctx_stack.top.claims = jwt_response
269+
g.claims = jwt_response
271270
response = f(*args, **kwargs)
272271

273272
set_cookie_on_response(
@@ -310,7 +309,7 @@ def decorated(*args, **kwargs):
310309
return Response("Unauthorized", 401)
311310

312311
# Save the claims on the context execute the original API
313-
_request_ctx_stack.top.claims = jwt_response
312+
g.claims = jwt_response
314313
response = f(*args, **kwargs)
315314

316315
set_cookie_on_response(
@@ -400,7 +399,7 @@ def decorated(*args, **kwargs):
400399
return Response("Unauthorized", 401)
401400

402401
# Save the claims on the context execute the original API
403-
_request_ctx_stack.top.claims = jwt_response
402+
g.claims = jwt_response
404403
response = f(*args, **kwargs)
405404

406405
set_cookie_on_response(

descope/management/user.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ def invite(
401401
additional_login_ids: Optional[List[str]] = None,
402402
sso_app_ids: Optional[List[str]] = None,
403403
template_id: str = "",
404+
test: bool = False,
404405
) -> dict:
405406
"""
406407
Create a new user and invite them via an email / text message.
@@ -429,7 +430,7 @@ def invite(
429430
role_names,
430431
user_tenants,
431432
True,
432-
False,
433+
test,
433434
picture,
434435
custom_attributes,
435436
verified_email,
@@ -601,6 +602,7 @@ def update(
601602
verified_phone: Optional[bool] = None,
602603
additional_login_ids: Optional[List[str]] = None,
603604
sso_app_ids: Optional[List[str]] = None,
605+
test: bool = False,
604606
) -> dict:
605607
"""
606608
Update an existing user with the given various fields. IMPORTANT: All parameters are used as overrides
@@ -622,6 +624,7 @@ def update(
622624
picture (str): Optional url for user picture
623625
custom_attributes (dict): Optional, set the different custom attributes values of the keys that were previously configured in Descope console app
624626
sso_app_ids (List[str]): Optional, list of SSO applications IDs to be associated with the user.
627+
test (bool, optional): Set to True to update a test user. Defaults to False.
625628
626629
Return value (dict):
627630
Return dict in the format
@@ -646,7 +649,7 @@ def update(
646649
family_name,
647650
role_names,
648651
user_tenants,
649-
False,
652+
test,
650653
picture,
651654
custom_attributes,
652655
verified_email,
@@ -750,6 +753,7 @@ def patch(
750753
verified_email: Optional[bool] = None,
751754
verified_phone: Optional[bool] = None,
752755
sso_app_ids: Optional[List[str]] = None,
756+
test: bool = False,
753757
) -> dict:
754758
"""
755759
Patches an existing user with the given various fields. Only the given fields will be used to update the user.
@@ -769,6 +773,7 @@ def patch(
769773
picture (str): Optional url for user picture
770774
custom_attributes (dict): Optional, set the different custom attributes values of the keys that were previously configured in Descope console app
771775
sso_app_ids (List[str]): Optional, list of SSO applications IDs to be associated with the user.
776+
test (bool, optional): Set to True to update a test user. Defaults to False.
772777
773778
Return value (dict):
774779
Return dict in the format
@@ -795,6 +800,7 @@ def patch(
795800
verified_email,
796801
verified_phone,
797802
sso_app_ids,
803+
test,
798804
),
799805
pswd=self._auth.management_key,
800806
)

poetry.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ classifiers = [
1919
"Programming Language :: Python :: 3.10",
2020
"Programming Language :: Python :: 3.11",
2121
"Programming Language :: Python :: 3.12",
22+
"Programming Language :: Python :: 3.13",
2223
"License :: OSI Approved :: MIT License",
2324
"Topic :: Software Development :: Libraries :: Python Modules",
2425
"Typing :: Typed",

0 commit comments

Comments
 (0)