44from ellar .common .constants import (
55 EXCEPTION_HANDLERS_KEY ,
66 MIDDLEWARE_HANDLERS_KEY ,
7- MODULE_FIELDS ,
7+ MODULE_DECORATOR_ITEM ,
8+ MODULE_METADATA ,
89 TEMPLATE_FILTER_KEY ,
910 TEMPLATE_GLOBAL_KEY ,
1011)
1112from ellar .common .exceptions import CallableExceptionHandler
1213from ellar .core .middleware import FunctionBasedMiddleware , Middleware
1314from ellar .reflect import reflect
1415
16+ from ...utils import get_functions_with_tag
1517from .helper import module_callable_factory
1618
1719if t .TYPE_CHECKING : # pragma: no cover
@@ -24,9 +26,6 @@ class ModuleBaseBuilder:
2426
2527 def __init__ (self , cls : t .Union [t .Type ["ModuleBase" ], "ModuleBaseMeta" ]) -> None :
2628 self ._cls = cls
27- self ._cls .__MODULE_FIELDS__ = t .cast (
28- t .Dict , getattr (self ._cls , MODULE_FIELDS , None ) or {}
29- )
3029 self ._actions : t .Dict [str , t .Callable [[t .Any ], None ]] = {}
3130 self ._actions .update (
3231 {
@@ -39,50 +38,47 @@ def __init__(self, cls: t.Union[t.Type["ModuleBase"], "ModuleBaseMeta"]) -> None
3938
4039 def exception_config (self , exception_dict : t .Dict ) -> None :
4140 for k , v in exception_dict .items ():
42- func = CallableExceptionHandler (
43- self ._cls , callable_exception_handler = v , exc_class_or_status_code = k
41+ self ._cls .MODULE_FIELDS .setdefault (EXCEPTION_HANDLERS_KEY , []).append (
42+ CallableExceptionHandler (
43+ callable_exception_handler = module_callable_factory (v , self ._cls ),
44+ exc_class_or_status_code = k ,
45+ )
4446 )
45- reflect .define_metadata (EXCEPTION_HANDLERS_KEY , [func ], self ._cls )
4647
4748 @t .no_type_check
4849 def middleware_config (self , middleware : AttributeDict ) -> None :
4950 dispatch = module_callable_factory (middleware .dispatch , self ._cls )
50- reflect .define_metadata (
51- MIDDLEWARE_HANDLERS_KEY ,
52- [
53- Middleware (
54- FunctionBasedMiddleware , dispatch = dispatch , ** middleware .options
55- )
56- ],
57- self ._cls ,
51+ self ._cls .MODULE_FIELDS .setdefault (MIDDLEWARE_HANDLERS_KEY , []).append (
52+ Middleware (
53+ FunctionBasedMiddleware ,
54+ dispatch = dispatch ,
55+ ** middleware .options ,
56+ provider_token = reflect .get_metadata (MODULE_METADATA .NAME , self ._cls ),
57+ )
5858 )
5959
6060 def template_filter_config (self , template_filter : "TemplateFunctionData" ) -> None :
61- reflect .define_metadata (
62- TEMPLATE_FILTER_KEY ,
61+ self ._cls .MODULE_FIELDS .setdefault (TEMPLATE_FILTER_KEY , {}).update (
6362 {
6463 template_filter .name : module_callable_factory (
6564 template_filter .func , self ._cls
6665 )
67- },
68- self ._cls ,
66+ }
6967 )
7068
7169 def template_global_config (self , template_filter : "TemplateFunctionData" ) -> None :
72- reflect .define_metadata (
73- TEMPLATE_GLOBAL_KEY ,
70+ self ._cls .MODULE_FIELDS .setdefault (TEMPLATE_GLOBAL_KEY , {}).update (
7471 {
7572 template_filter .name : module_callable_factory (
7673 template_filter .func , self ._cls
7774 )
78- },
79- self ._cls ,
75+ }
8076 )
8177
82- def build (self , namespace : t . Dict ) -> None :
83- for name , item in namespace . items ():
84- for k , func in self . _actions . items ():
85- if hasattr ( item , k ):
86- value = item . __dict__ . pop ( k )
87- func ( value )
88- self . _cls . __MODULE_FIELDS__ [ name ] = item
78+ def build (self ) -> None :
79+ self . _cls . MODULE_FIELDS = {}
80+
81+ for _ , item in get_functions_with_tag ( self . _cls , MODULE_DECORATOR_ITEM ):
82+ action_name = getattr ( item , MODULE_DECORATOR_ITEM )
83+ handler = self . _actions [ action_name ]
84+ handler ( item . __dict__ [ action_name ])
0 commit comments