Skip to content

Commit c4be74c

Browse files
committed
update: standardizes __init__ exports
- Defines aliases for old override config classes for backward compatibility - Adds `__all__` to recipe `__init__` files to explicitly declare exports - FIxes `apply_plugins` config input/return type - Adds ruff rule to format `__all__` exports - Updates changelog
1 parent 5cb4669 commit c4be74c

File tree

34 files changed

+335
-122
lines changed

34 files changed

+335
-122
lines changed

CHANGELOG.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88

99
## [unreleased]
1010

11+
## [0.31.0] - 2025-07-18
12+
### Adds plugins support
13+
- Adds an `experimental` property (`SuperTokensExperimentalConfig`) to the `SuperTokensConfig`
14+
- Plugins can be configured under using the `plugins` property in the `experimental` config
15+
- Refactors the AccountLinking recipe to be automatically initialized on SuperTokens init
16+
17+
### Breaking Changes
18+
- `AccountLinkingRecipe.get_instance` will now raise an exception if not initialized
19+
- Various config classes renamed for consistency across the codebase, and classes added where they were missing
20+
- Old classes added to the recipe modules as aliases for backward compatibility, but will be removed in future versions. Prefer using the renamed classes.
21+
- `InputOverrideConfig` renamed to `<Recipe>OverrideConfig`
22+
- `OverrideConfig` renamed to `Normalised<Recipe>OverrideConfig`
23+
- Input config classes like `<Recipe>InputConfig` renamed to `<Recipe>Config`
24+
- Normalised config classes like `<Recipe>Config` renamed to `Normalised<Recipe>Config`
25+
- Changed classes:
26+
- AccountLinking `InputOverrideConfig` -> `AccountLinkingOverrideConfig`
27+
- Dashboard `InputOverrideConfig` -> `DashboardOverrideConfig`
28+
- EmailPassword
29+
- `InputOverrideConfig` -> `EmailPasswordOverrideConfig`
30+
- `exceptions` export removed from `__init__`, import the `exceptions` module directly
31+
- EmailVerification
32+
- `InputOverrideConfig` -> `EmailVerificationOverrideConfig`
33+
- `exception` export removed from `__init__`, import the `exceptions` module directly
34+
- JWT `OverrideConfig` -> `JWTOverrideConfig`
35+
- MultiFactorAuth `OverrideConfig` -> `MultiFactorAuthOverrideConfig`
36+
- Multitenancy
37+
- `InputOverrideConfig` -> `MultitenancyOverrideConfig`
38+
- `exceptions` export removed from `__init__`, import the `exceptions` module directly
39+
- OAuth2Provider
40+
- `InputOverrideConfig` -> `OAuth2ProviderOverrideConfig`
41+
- `exceptions` export removed from `__init__`, import the `exceptions` module directly
42+
- OpenId `InputOverrideConfig` -> `OpenIdOverrideConfig`
43+
- Passwordless `InputOverrideConfig` -> `PasswordlessOverrideConfig`
44+
- Session
45+
- `InputOverrideConfig` -> `SessionOverrideConfig`
46+
- `exceptions` export removed from `__init__`, import the `exceptions` module directly
47+
- ThirdParty
48+
- `InputOverrideConfig` -> `ThirdPartyOverrideConfig`
49+
- `exceptions` export removed from `__init__`, import the `exceptions` module directly
50+
- TOTP `OverrideConfig` -> `TOTPOverrideConfig`
51+
- UserMetadata `InputOverrideConfig` -> `UserMetadataOverrideConfig`
52+
- UserRoles `InputOverrideConfig` -> `UserRolesOverrideConfig`
53+
1154
## [0.30.0] - 2025-05-27
1255
### Adds Webauthn (Passkeys) support
1356
- Adds Webauthn recipe with support for:

pyproject.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ line-length = 88 # Match Black's formatting
33
src = ["supertokens_python"]
44

55
[tool.ruff.lint]
6-
extend-select = ["I"] # enable import sorting
6+
extend-select = [
7+
"I", # enable import sorting
8+
"RUF022", # Sort __all__ exports
9+
]
710

811
[tool.ruff.format]
912
quote-style = "double" # Default

supertokens_python/plugins.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,31 +57,32 @@
5757
from supertokens_python.recipe.webauthn.types.config import WebauthnConfig
5858
from supertokens_python.supertokens import SupertokensPublicConfig
5959

60-
T = TypeVar("T")
60+
RecipeConfigType = TypeVar(
61+
"RecipeConfigType",
62+
bound=Union[
63+
"AccountLinkingConfig",
64+
"DashboardConfig",
65+
"EmailPasswordConfig",
66+
"EmailVerificationConfig",
67+
"JWTConfig",
68+
"MultiFactorAuthConfig",
69+
"MultitenancyConfig",
70+
"OAuth2ProviderConfig",
71+
"OpenIdConfig",
72+
"PasswordlessConfig",
73+
"SessionConfig",
74+
"ThirdPartyConfig",
75+
"TOTPConfig",
76+
"UserMetadataConfig",
77+
"UserRolesConfig",
78+
"WebauthnConfig",
79+
],
80+
)
6181

6282

6383
RecipeInterfaceType = TypeVar("RecipeInterfaceType", bound=BaseRecipeInterface)
6484
APIInterfaceType = TypeVar("APIInterfaceType", bound=BaseAPIInterface)
6585

66-
RecipeConfigType = Union[
67-
"AccountLinkingConfig",
68-
"DashboardConfig",
69-
"EmailPasswordConfig",
70-
"EmailVerificationConfig",
71-
"JWTConfig",
72-
"MultiFactorAuthConfig",
73-
"MultitenancyConfig",
74-
"OAuth2ProviderConfig",
75-
"OpenIdConfig",
76-
"PasswordlessConfig",
77-
"SessionConfig",
78-
"ThirdPartyConfig",
79-
"TOTPConfig",
80-
"UserMetadataConfig",
81-
"UserRolesConfig",
82-
"WebauthnConfig",
83-
]
84-
8586

8687
class RecipeInitRequiredFunction(Protocol):
8788
def __call__(self, sdk_version: str) -> bool: ...

supertokens_python/recipe/accountlinking/__init__.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515

1616
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Optional, Union
1717

18-
from ...types import User
19-
from . import types
20-
from .recipe import AccountLinkingRecipe
18+
from supertokens_python.types import User
2119

22-
AccountLinkingOverrideConfig = types.AccountLinkingOverrideConfig
23-
RecipeLevelUser = types.RecipeLevelUser
24-
AccountInfoWithRecipeIdAndUserId = types.AccountInfoWithRecipeIdAndUserId
25-
ShouldAutomaticallyLink = types.ShouldAutomaticallyLink
26-
ShouldNotAutomaticallyLink = types.ShouldNotAutomaticallyLink
20+
from .recipe import AccountLinkingRecipe
21+
from .types import (
22+
AccountInfoWithRecipeIdAndUserId,
23+
AccountLinkingOverrideConfig,
24+
InputOverrideConfig,
25+
RecipeLevelUser,
26+
ShouldAutomaticallyLink,
27+
ShouldNotAutomaticallyLink,
28+
)
2729

2830
if TYPE_CHECKING:
2931
from ..session.interfaces import SessionContainer
@@ -50,3 +52,15 @@ def init(
5052
return AccountLinkingRecipe.init(
5153
on_account_linked, should_do_automatic_account_linking, override
5254
)
55+
56+
57+
__all__ = [
58+
"AccountInfoWithRecipeIdAndUserId",
59+
"AccountLinkingOverrideConfig",
60+
"AccountLinkingRecipe",
61+
"InputOverrideConfig", # deprecated, use AccountLinkingOverrideConfig instead
62+
"RecipeLevelUser",
63+
"ShouldAutomaticallyLink",
64+
"ShouldNotAutomaticallyLink",
65+
"init",
66+
]

supertokens_python/recipe/accountlinking/types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
NormalisedAccountLinkingOverrideConfig = BaseNormalisedOverrideConfigWithoutAPI[
4444
RecipeInterface
4545
]
46+
InputOverrideConfig = AccountLinkingOverrideConfig
47+
"""Deprecated, use `AccountLinkingOverrideConfig` instead."""
4648

4749

4850
class AccountInfoWithRecipeId(AccountInfo):

supertokens_python/recipe/dashboard/__init__.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616

1717
from typing import List, Optional
1818

19-
from supertokens_python.recipe.dashboard import utils
2019
from supertokens_python.supertokens import RecipeInit
2120

2221
from .recipe import DashboardRecipe
23-
24-
DashboardOverrideConfig = utils.DashboardOverrideConfig
22+
from .utils import DashboardOverrideConfig, InputOverrideConfig
2523

2624

2725
def init(
@@ -34,3 +32,11 @@ def init(
3432
admins,
3533
override,
3634
)
35+
36+
37+
__all__ = [
38+
"DashboardOverrideConfig",
39+
"DashboardRecipe",
40+
"InputOverrideConfig", # deprecated, use DashboardOverrideConfig instead
41+
"init",
42+
]

supertokens_python/recipe/dashboard/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ def to_json(self) -> Dict[str, Any]:
8181
NormalisedDashboardOverrideConfig = BaseNormalisedOverrideConfig[
8282
RecipeInterface, APIInterface
8383
]
84+
InputOverrideConfig = DashboardOverrideConfig
85+
"""Deprecated, use `DashboardOverrideConfig` instead."""
8486

8587

8688
class DashboardConfig(BaseConfig[RecipeInterface, APIInterface]):

supertokens_python/recipe/emailpassword/__init__.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,46 @@
1515

1616
from typing import TYPE_CHECKING, Union
1717

18-
from supertokens_python.ingredients.emaildelivery import types as emaildelivery_types
19-
from supertokens_python.ingredients.emaildelivery.types import EmailDeliveryConfig
18+
from supertokens_python.ingredients.emaildelivery.types import (
19+
EmailDeliveryConfig,
20+
EmailDeliveryInterface,
21+
)
2022
from supertokens_python.recipe.emailpassword.types import EmailTemplateVars
2123

22-
from . import exceptions as ex
23-
from . import utils
24-
from .emaildelivery import services as emaildelivery_services
24+
from .emaildelivery.services import SMTPService
2525
from .recipe import EmailPasswordRecipe
26-
27-
exceptions = ex
28-
EmailPasswordOverrideConfig = utils.EmailPasswordOverrideConfig
29-
InputSignUpFeature = utils.InputSignUpFeature
30-
InputFormField = utils.InputFormField
31-
SMTPService = emaildelivery_services.SMTPService
32-
EmailDeliveryInterface = emaildelivery_types.EmailDeliveryInterface
26+
from .utils import (
27+
EmailPasswordOverrideConfig,
28+
InputFormField,
29+
InputOverrideConfig,
30+
InputSignUpFeature,
31+
)
3332

3433
if TYPE_CHECKING:
3534
from supertokens_python.supertokens import RecipeInit
3635

3736

3837
def init(
39-
sign_up_feature: Union[utils.InputSignUpFeature, None] = None,
40-
override: Union[utils.EmailPasswordOverrideConfig, None] = None,
38+
sign_up_feature: Union[InputSignUpFeature, None] = None,
39+
override: Union[EmailPasswordOverrideConfig, None] = None,
4140
email_delivery: Union[EmailDeliveryConfig[EmailTemplateVars], None] = None,
4241
) -> RecipeInit:
4342
return EmailPasswordRecipe.init(
4443
sign_up_feature,
4544
override,
4645
email_delivery,
4746
)
47+
48+
49+
__all__ = [
50+
"EmailDeliveryConfig",
51+
"EmailDeliveryInterface",
52+
"EmailPasswordOverrideConfig",
53+
"EmailPasswordRecipe",
54+
"EmailTemplateVars",
55+
"InputFormField",
56+
"InputOverrideConfig", # deprecated, use EmailPasswordOverrideConfig instead
57+
"InputSignUpFeature",
58+
"SMTPService",
59+
"init",
60+
]

supertokens_python/recipe/emailpassword/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ def validate_and_normalise_reset_password_using_token_config(
221221
NormalisedEmailPasswordOverrideConfig = BaseNormalisedOverrideConfig[
222222
RecipeInterface, APIInterface
223223
]
224+
InputOverrideConfig = EmailPasswordOverrideConfig
225+
"""Deprecated, use `EmailPasswordOverrideConfig` instead."""
224226

225227

226228
class EmailPasswordConfig(BaseConfig[RecipeInterface, APIInterface]):

supertokens_python/recipe/emailverification/__init__.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,13 @@
1515

1616
from typing import TYPE_CHECKING, Optional, Union
1717

18-
from ...ingredients.emaildelivery.types import EmailDeliveryConfig
19-
from . import exceptions as ex
20-
from . import recipe, types, utils
21-
from .emaildelivery import services as emaildelivery_services
22-
from .interfaces import TypeGetEmailForUserIdFunction
23-
from .recipe import EmailVerificationRecipe
24-
from .types import EmailTemplateVars
25-
from .utils import MODE_TYPE, EmailVerificationOverrideConfig
26-
27-
InputOverrideConfig = utils.EmailVerificationOverrideConfig
28-
exception = ex
29-
SMTPService = emaildelivery_services.SMTPService
30-
EmailVerificationClaim = recipe.EmailVerificationClaim
31-
EmailDeliveryInterface = types.EmailDeliveryInterface
18+
from supertokens_python.ingredients.emaildelivery.types import EmailDeliveryConfig
3219

20+
from .emaildelivery.services import SMTPService
21+
from .interfaces import TypeGetEmailForUserIdFunction
22+
from .recipe import EmailVerificationClaim, EmailVerificationRecipe
23+
from .types import EmailDeliveryInterface, EmailTemplateVars
24+
from .utils import MODE_TYPE, EmailVerificationOverrideConfig, InputOverrideConfig
3325

3426
if TYPE_CHECKING:
3527
from supertokens_python.supertokens import RecipeInit
@@ -47,3 +39,16 @@ def init(
4739
get_email_for_recipe_user_id,
4840
override,
4941
)
42+
43+
44+
__all__ = [
45+
"EmailDeliveryInterface",
46+
"EmailTemplateVars",
47+
"EmailVerificationClaim",
48+
"EmailVerificationOverrideConfig",
49+
"EmailVerificationRecipe",
50+
"InputOverrideConfig", # deprecated, use EmailVerificationOverrideConfig instead
51+
"SMTPService",
52+
"TypeGetEmailForUserIdFunction",
53+
"init",
54+
]

0 commit comments

Comments
 (0)