1- from typing import Callable as _Callable , List as _List
1+ from typing import Callable as _Callable , Dict as _Dict
22from misc .codegen .lib import schema as _schema
33import inspect as _inspect
44from dataclasses import dataclass as _dataclass
@@ -94,6 +94,7 @@ class _Pragma(_schema.PropertyModifier):
9494 For schema classes it acts as a python decorator with `@`.
9595 """
9696 pragma : str
97+ value : object = None
9798 remove : bool = False
9899
99100 def __post_init__ (self ):
@@ -108,20 +109,32 @@ def negate(self) -> "PropertyModifier":
108109
109110 def __call__ (self , cls : type ) -> type :
110111 """ use this pragma as a decorator on classes """
111- if "_pragmas" in cls . __dict__ : # not using hasattr as we don't want to land on inherited pragmas
112- self . _apply ( cls ._pragmas )
113- elif not self . remove :
114- cls ._pragmas = [ self . pragma ]
112+ # not using hasattr as we don't want to land on inherited pragmas
113+ if "_pragmas" not in cls .__dict__ :
114+ cls . _pragmas = {}
115+ self . _apply ( cls ._pragmas )
115116 return cls
116117
117- def _apply (self , pragmas : _List [str ]) -> None :
118+ def _apply (self , pragmas : _Dict [str , object ]) -> None :
118119 if self .remove :
119- try :
120- pragmas .remove (self .pragma )
121- except ValueError :
122- pass
120+ pragmas .pop (self .pragma , None )
123121 else :
124- pragmas .append (self .pragma )
122+ pragmas [self .pragma ] = self .value
123+
124+
125+ @_dataclass
126+ class _ParametrizedPragma :
127+ """ A class or property parametrized pragma.
128+ Needs to be applied to a parameter to give a pragma.
129+ """
130+ pragma : str
131+ function : _Callable [[...], object ] = None
132+
133+ def __call__ (self , * args , ** kwargs ) -> _Pragma :
134+ return _Pragma (self .pragma , value = self .function (* args , ** kwargs ))
135+
136+ def __invert__ (self ) -> _Pragma :
137+ return _Pragma (self .pragma , remove = True )
125138
126139
127140class _Optionalizer (_schema .PropertyModifier ):
@@ -251,9 +264,9 @@ def decorator(cls: type) -> _PropertyAnnotation:
251264 if cls .__doc__ is not None :
252265 annotated_cls .__doc__ = cls .__doc__
253266 old_pragmas = getattr (annotated_cls , "_pragmas" , None )
254- new_pragmas = getattr (cls , "_pragmas" , [] )
267+ new_pragmas = getattr (cls , "_pragmas" , {} )
255268 if old_pragmas :
256- old_pragmas .extend (new_pragmas )
269+ old_pragmas .update (new_pragmas )
257270 else :
258271 annotated_cls ._pragmas = new_pragmas
259272 for a , v in cls .__dict__ .items ():
0 commit comments