@@ -251,6 +251,17 @@ def init_values(self) -> None:
251
251
if name in self .values :
252
252
self .__dict__ [name ] = config [name ]
253
253
254
+ def post_init_values (self ) -> None :
255
+ """
256
+ Initialize additional config variables that are added after init_values() called.
257
+ """
258
+ config = self ._raw_config
259
+ for name in config :
260
+ if name not in self .__dict__ and name in self .values :
261
+ self .__dict__ [name ] = config [name ]
262
+
263
+ check_confval_types (None , self )
264
+
254
265
def __getattr__ (self , name : str ) -> Any :
255
266
if name .startswith ('_' ):
256
267
raise AttributeError (name )
@@ -427,7 +438,7 @@ def check_confval_types(app: "Sphinx", config: Config) -> None:
427
438
"but `{current}` is given." )
428
439
logger .warning (msg .format (name = confval .name ,
429
440
current = confval .value ,
430
- candidates = annotations .candidates ))
441
+ candidates = annotations .candidates ), once = True )
431
442
else :
432
443
if type (confval .value ) is type (default ):
433
444
continue
@@ -452,13 +463,13 @@ def check_confval_types(app: "Sphinx", config: Config) -> None:
452
463
permitted = " or " .join (wrapped_annotations )
453
464
logger .warning (msg .format (name = confval .name ,
454
465
current = type (confval .value ),
455
- permitted = permitted ))
466
+ permitted = permitted ), once = True )
456
467
else :
457
468
msg = __ ("The config value `{name}' has type `{current.__name__}', "
458
469
"defaults to `{default.__name__}'." )
459
470
logger .warning (msg .format (name = confval .name ,
460
471
current = type (confval .value ),
461
- default = type (default )))
472
+ default = type (default )), once = True )
462
473
463
474
464
475
def check_primary_domain (app : "Sphinx" , config : Config ) -> None :
0 commit comments