@@ -181,7 +181,7 @@ def test_parse_annotation(annotation: Any, module: str, class_name: str, args: t
181181 pytest .param (Type [A ], rf":py:class:`~typing.Type`\ \[:py:class:`~{ __name__ } .A`]" , id = "typing-A" ),
182182 pytest .param (Any , ":py:data:`~typing.Any`" , id = "Any" ),
183183 pytest .param (AnyStr , ":py:data:`~typing.AnyStr`" , id = "AnyStr" ),
184- pytest .param (Generic [T ], r":py:class:`~typing.Generic`\ \[:py:class:`~typing.TypeVar`\ \(``T``)]" , id = "Generic" ),
184+ pytest .param (Generic [T ], r":py:class:`~typing.Generic`\ \[:py:class:`~typing.TypeVar`\ \(``T``)]" , id = "Generic" ), # type: ignore[index]
185185 pytest .param (Mapping , ":py:class:`~collections.abc.Mapping`" , id = "Mapping" ),
186186 pytest .param (
187187 Mapping [T , int ], # type: ignore[valid-type]
@@ -244,37 +244,63 @@ def test_parse_annotation(annotation: Any, module: str, class_name: str, args: t
244244 r":py:data:`~typing.Tuple`\ \[:py:class:`str`, :py:data:`...<Ellipsis>`]" ,
245245 id = "Tuple-str-Ellipsis" ,
246246 ),
247- pytest .param (Union , ":py:data:`~typing.Union`" , id = "Union" ),
247+ pytest .param (Union , "" if sys . version_info >= ( 3 , 14 ) else " :py:data:`~typing.Union`" , id = "Union" ),
248248 pytest .param (
249249 Union [str , bool ],
250- r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:class:`bool`]" ,
250+ ":py:class:`str` | :py:class:`bool`"
251+ if sys .version_info >= (3 , 14 )
252+ else r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:class:`bool`]" ,
251253 id = "Union-str-bool" ,
252254 ),
253255 pytest .param (
254256 Union [str , bool , None ],
255- r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:class:`bool`, :py:obj:`None`]" ,
257+ ":py:class:`str` | :py:class:`bool` | :py:obj:`None`"
258+ if sys .version_info >= (3 , 14 )
259+ else r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:class:`bool`, :py:obj:`None`]" ,
256260 id = "Union-str-bool-None" ,
257261 ),
258262 pytest .param (
259263 Union [str , Any ],
260- r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:data:`~typing.Any`]" ,
264+ ":py:class:`str` | :py:data:`~typing.Any`"
265+ if sys .version_info >= (3 , 14 )
266+ else r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:data:`~typing.Any`]" ,
261267 id = "Union-str-Any" ,
262268 ),
263269 pytest .param (
264270 Optional [str ],
265- r":py:data:`~typing.Optional`\ \[:py:class:`str`]" ,
271+ ":py:class:`str` | :py:obj:`None`"
272+ if sys .version_info >= (3 , 14 )
273+ else r":py:data:`~typing.Optional`\ \[:py:class:`str`]" ,
266274 id = "Optional-str" ,
267275 ),
268276 pytest .param (
269277 Union [str , None ],
270- r":py:data:`~typing.Optional`\ \[:py:class:`str`]" ,
278+ ":py:class:`str` | :py:obj:`None`"
279+ if sys .version_info >= (3 , 14 )
280+ else r":py:data:`~typing.Optional`\ \[:py:class:`str`]" ,
271281 id = "Optional-str-None" ,
272282 ),
273283 pytest .param (
274284 Optional [str | bool ],
275- r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:class:`bool`, :py:obj:`None`]" ,
285+ ":py:class:`str` | :py:class:`bool` | :py:obj:`None`"
286+ if sys .version_info >= (3 , 14 )
287+ else r":py:data:`~typing.Union`\ \[:py:class:`str`, :py:class:`bool`, :py:obj:`None`]" ,
276288 id = "Optional-Union-str-bool" ,
277289 ),
290+ pytest .param (
291+ RecList ,
292+ ":py:class:`int` | :py:class:`~typing.List`\\ \\ [RecList]"
293+ if sys .version_info >= (3 , 14 )
294+ else r":py:data:`~typing.Union`\ \[:py:class:`int`, :py:class:`~typing.List`\ \[RecList]]" ,
295+ id = "RecList" ,
296+ ),
297+ pytest .param (
298+ MutualRecA ,
299+ ":py:class:`bool` | :py:class:`~typing.List`\\ \\ [MutualRecB]"
300+ if sys .version_info >= (3 , 14 )
301+ else r":py:data:`~typing.Union`\ \[:py:class:`bool`, :py:class:`~typing.List`\ \[MutualRecB]]" ,
302+ id = "MutualRecA" ,
303+ ),
278304 pytest .param (Callable , ":py:class:`~collections.abc.Callable`" , id = "Callable" ),
279305 pytest .param (
280306 Callable [..., int ],
@@ -359,14 +385,6 @@ def test_parse_annotation(annotation: Any, module: str, class_name: str, args: t
359385 r":py:data:`~typing.Tuple`\ \[:py:class:`int`, :py:data:`...<Ellipsis>`]" ,
360386 id = "Tuple-p-Ellipsis" ,
361387 ),
362- pytest .param (
363- RecList , r":py:data:`~typing.Union`\ \[:py:class:`int`, :py:class:`~typing.List`\ \[RecList]]" , id = "RecList"
364- ),
365- pytest .param (
366- MutualRecA ,
367- r":py:data:`~typing.Union`\ \[:py:class:`bool`, :py:class:`~typing.List`\ \[MutualRecB]]" ,
368- id = "MutualRecA" ,
369- ),
370388]
371389
372390
@@ -418,7 +436,9 @@ def test_format_annotation(inv: Inventory, annotation: Any, expected_result: str
418436 assert format_annotation (annotation , conf ) == expected_result
419437
420438 # Test for the correct role (class vs data) using the official Sphinx inventory
421- if any (modname in expected_result for modname in ("typing" , "types" )):
439+ if any (modname in expected_result for modname in ("typing" , "types" )) and not (
440+ sys .version_info >= (3 , 14 ) and isinstance (annotation , Union )
441+ ):
422442 m = re .match (r"^:py:(?P<role>class|data|func):`~(?P<name>[^`]+)`" , result )
423443 assert m , "No match"
424444 name = m .group ("name" )
0 commit comments