@@ -94,20 +94,23 @@ def match(self, value: str | list | tuple) -> bool:
9494
9595
9696_OptValidTypes = Union [tuple [()], tuple [type , ...], frozenset [type ], ENUM ]
97+ _DescriptionType = Union [str , None ]
9798
9899
99100class _Opt :
100- __slots__ = 'default' , 'rebuild' , 'valid_types'
101+ __slots__ = 'default' , 'rebuild' , 'valid_types' , 'description'
101102
102103 default : Any
103104 rebuild : _ConfigRebuild
104105 valid_types : _OptValidTypes
106+ description : _DescriptionType
105107
106108 def __init__ (
107109 self ,
108110 default : Any ,
109111 rebuild : _ConfigRebuild ,
110112 valid_types : _OptValidTypes ,
113+ description : _DescriptionType = None ,
111114 ) -> None :
112115 """Configuration option type for Sphinx.
113116
@@ -120,52 +123,56 @@ def __init__(
120123 super ().__setattr__ ('default' , default )
121124 super ().__setattr__ ('rebuild' , rebuild )
122125 super ().__setattr__ ('valid_types' , valid_types )
126+ super ().__setattr__ ('description' , description )
123127
124128 def __repr__ (self ) -> str :
125129 return (
126130 f'{ self .__class__ .__qualname__ } ('
127131 f'default={ self .default !r} , '
128132 f'rebuild={ self .rebuild !r} , '
129- f'valid_types={ self .valid_types !r} )'
133+ f'valid_types={ self .rebuild !r} , '
134+ f'description={ self .description !r} )'
130135 )
131136
132137 def __eq__ (self , other : object ) -> bool :
133138 if isinstance (other , _Opt ):
134- self_tpl = (self .default , self .rebuild , self .valid_types )
135- other_tpl = (other .default , other .rebuild , other .valid_types )
139+ self_tpl = (self .default , self .rebuild , self .valid_types , self . description )
140+ other_tpl = (other .default , other .rebuild , other .valid_types , self . description )
136141 return self_tpl == other_tpl
137142 return NotImplemented
138143
139144 def __lt__ (self , other : _Opt ) -> bool :
140145 if self .__class__ is other .__class__ :
141- self_tpl = (self .default , self .rebuild , self .valid_types )
142- other_tpl = (other .default , other .rebuild , other .valid_types )
146+ self_tpl = (self .default , self .rebuild , self .valid_types , self . description )
147+ other_tpl = (other .default , other .rebuild , other .valid_types , self . description )
143148 return self_tpl > other_tpl
144149 return NotImplemented
145150
146151 def __hash__ (self ) -> int :
147- return hash ((self .default , self .rebuild , self .valid_types ))
152+ return hash ((self .default , self .rebuild , self .valid_types , self . description ))
148153
149154 def __setattr__ (self , key : str , value : Any ) -> None :
150- if key in {'default' , 'rebuild' , 'valid_types' }:
155+ if key in {'default' , 'rebuild' , 'valid_types' , 'description' }:
151156 msg = f'{ self .__class__ .__name__ !r} object does not support assignment to { key !r} '
152157 raise TypeError (msg )
153158 super ().__setattr__ (key , value )
154159
155160 def __delattr__ (self , key : str ) -> None :
156- if key in {'default' , 'rebuild' , 'valid_types' }:
161+ if key in {'default' , 'rebuild' , 'valid_types' , 'description' }:
157162 msg = f'{ self .__class__ .__name__ !r} object does not support deletion of { key !r} '
158163 raise TypeError (msg )
159164 super ().__delattr__ (key )
160165
161- def __getstate__ (self ) -> tuple [Any , _ConfigRebuild , _OptValidTypes ]:
162- return self .default , self .rebuild , self .valid_types
166+ def __getstate__ (self ) -> tuple [Any , _ConfigRebuild , _OptValidTypes , _DescriptionType ]:
167+ return self .default , self .rebuild , self .valid_types , self . description
163168
164- def __setstate__ (self , state : tuple [Any , _ConfigRebuild , _OptValidTypes ]) -> None :
165- default , rebuild , valid_types = state
169+ def __setstate__ (
170+ self , state : tuple [Any , _ConfigRebuild , _OptValidTypes , _DescriptionType ]) -> None :
171+ default , rebuild , valid_types , description = state
166172 super ().__setattr__ ('default' , default )
167173 super ().__setattr__ ('rebuild' , rebuild )
168174 super ().__setattr__ ('valid_types' , valid_types )
175+ super ().__setattr__ ('description' , description )
169176
170177 def __getitem__ (self , item : int | slice ) -> Any :
171178 warnings .warn (
@@ -445,7 +452,8 @@ def __iter__(self) -> Iterator[ConfigValue]:
445452 yield ConfigValue (name , getattr (self , name ), opt .rebuild )
446453
447454 def add (self , name : str , default : Any , rebuild : _ConfigRebuild ,
448- types : type | Collection [type ] | ENUM ) -> None :
455+ types : type | Collection [type ] | ENUM ,
456+ description : str | None = None ) -> None :
449457 if name in self ._options :
450458 raise ExtensionError (__ ('Config value %r already present' ) % name )
451459
@@ -455,7 +463,7 @@ def add(self, name: str, default: Any, rebuild: _ConfigRebuild,
455463
456464 # standardise valid_types
457465 valid_types = _validate_valid_types (types )
458- self ._options [name ] = _Opt (default , rebuild , valid_types )
466+ self ._options [name ] = _Opt (default , rebuild , valid_types , description )
459467
460468 def filter (self , rebuild : Set [_ConfigRebuild ]) -> Iterator [ConfigValue ]:
461469 if isinstance (rebuild , str ):
0 commit comments