11from __future__ import annotations
22
3+ import logging
34import typing as t
5+ from abc import ABC
46
57import pytest
68
911 Bool ,
1012 CInt ,
1113 Dict ,
14+ Enum ,
1215 HasTraits ,
1316 Instance ,
1417 Int ,
@@ -97,12 +100,14 @@ class T(HasTraits):
97100 ).tag (config = True )
98101
99102 t = T ()
100- reveal_type (List ("foo" )) # R: traitlets.traitlets.List
101- reveal_type (List ("" ).tag (sync = True )) # R: traitlets.traitlets.List
102- reveal_type (List (None , allow_none = True )) # R: traitlets.traitlets.List
103- reveal_type (List (None , allow_none = True ).tag (sync = True )) # R: traitlets.traitlets.List
104- reveal_type (T .latex_command ) # R: traitlets.traitlets.List
105- reveal_type (t .latex_command ) # R: builtins.list[Any]
103+ reveal_type (List (["foo" ])) # R: traitlets.traitlets.List[builtins.str]
104+ reveal_type (List (["" ]).tag (sync = True )) # R: traitlets.traitlets.List[builtins.str]
105+ reveal_type (List (None , allow_none = True )) # R: traitlets.traitlets.List[<nothing>]
106+ reveal_type (
107+ List (None , allow_none = True ).tag (sync = True ) # R: traitlets.traitlets.List[<nothing>]
108+ )
109+ reveal_type (T .latex_command ) # R: traitlets.traitlets.List[builtins.str]
110+ reveal_type (t .latex_command ) # R: builtins.list[builtins.str]
106111
107112
108113@pytest .mark .mypy_testing
@@ -111,19 +116,25 @@ class T(HasTraits):
111116 foo = Dict ({}, help = "Shell command used to compile latex." ).tag (config = True )
112117
113118 t = T ()
114- reveal_type (Dict ("foo" )) # R: traitlets.traitlets.Dict
115- reveal_type (Dict ( "" ). tag ( sync = True )) # R: traitlets.traitlets.Dict
116- reveal_type ( Dict (None , allow_none = True )) # R: traitlets.traitlets.Dict
117- reveal_type ( Dict ( None , allow_none = True ). tag ( sync = True )) # R: traitlets.traitlets.Dict
118- reveal_type (T .foo ) # R: traitlets.traitlets.Dict
119- reveal_type (t .foo ) # R: builtins.dict[Any , Any]
119+ reveal_type (Dict (None , allow_none = True )) # R: traitlets.traitlets.Dict[builtins.str, Any]
120+ reveal_type (
121+ Dict (None , allow_none = True ). tag ( sync = True ) # R: traitlets.traitlets.Dict[builtins.str, Any]
122+ )
123+ reveal_type (T .foo ) # R: traitlets.traitlets.Dict[builtins.str, Any]
124+ reveal_type (t .foo ) # R: builtins.dict[builtins.str , Any]
120125
121126
122127@pytest .mark .mypy_testing
123128def mypy_type_typing () -> None :
124129 class KernelSpec :
125130 item = Unicode ("foo" )
126131
132+ class KernelSpecSubclass (KernelSpec ):
133+ other = Unicode ("bar" )
134+
135+ class GatewayTokenRenewerBase (ABC ):
136+ item = Unicode ("foo" )
137+
127138 class KernelSpecManager (HasTraits ):
128139 """A manager for kernel specs."""
129140
@@ -136,12 +147,30 @@ class KernelSpecManager(HasTraits):
136147 )
137148 other_class = Type ("foo.bar.baz" )
138149
150+ other_kernel_spec_class = Type (
151+ default_value = KernelSpecSubclass ,
152+ klass = KernelSpec ,
153+ config = True ,
154+ )
155+
156+ gateway_token_renewer_class = Type (
157+ klass = GatewayTokenRenewerBase ,
158+ config = True ,
159+ help = """The class to use for Gateway token renewal. (JUPYTER_GATEWAY_TOKEN_RENEWER_CLASS env var)""" ,
160+ )
161+
139162 t = KernelSpecManager ()
140- reveal_type (t .kernel_spec_class ) # R: def () -> tests.test_typing.KernelSpec@124
141- reveal_type (t .kernel_spec_class ()) # R: tests.test_typing.KernelSpec@124
163+ reveal_type (t .kernel_spec_class ) # R: def () -> tests.test_typing.KernelSpec@129
164+ reveal_type (t .kernel_spec_class ()) # R: tests.test_typing.KernelSpec@129
142165 reveal_type (t .kernel_spec_class ().item ) # R: builtins.str
143166 reveal_type (t .other_class ) # R: builtins.type
144167 reveal_type (t .other_class ()) # R: Any
168+ reveal_type (t .other_kernel_spec_class ) # R: def () -> tests.test_typing.KernelSpec@129
169+ reveal_type (t .other_kernel_spec_class ()) # R: tests.test_typing.KernelSpec@129
170+ reveal_type (
171+ t .gateway_token_renewer_class # R: def () -> tests.test_typing.GatewayTokenRenewerBase@135
172+ )
173+ reveal_type (t .gateway_token_renewer_class ()) # R: tests.test_typing.GatewayTokenRenewerBase@135
145174
146175
147176@pytest .mark .mypy_testing
@@ -181,6 +210,42 @@ class T(HasTraits):
181210 reveal_type (t .export_format ) # R: builtins.str
182211
183212
213+ @pytest .mark .mypy_testing
214+ def mypy_enum_typing () -> None :
215+ class T (HasTraits ):
216+ log_level = Enum (
217+ (0 , 10 , 20 , 30 , 40 , 50 ),
218+ default_value = logging .WARN ,
219+ help = "Set the log level by value or name." ,
220+ ).tag (config = True )
221+
222+ t = T ()
223+ reveal_type (
224+ Enum ( # R: traitlets.traitlets.Enum[builtins.str]
225+ ("foo" ,)
226+ )
227+ )
228+ reveal_type (
229+ Enum ( # R: traitlets.traitlets.Enum[builtins.str]
230+ ["" ]
231+ ).tag (sync = True )
232+ )
233+ reveal_type (
234+ Enum ( # R: traitlets.traitlets.Enum[None]
235+ None , allow_none = True
236+ )
237+ )
238+ reveal_type (
239+ Enum ( # R: traitlets.traitlets.Enum[None]
240+ None , allow_none = True
241+ ).tag (sync = True )
242+ )
243+ reveal_type (
244+ T .log_level # R: traitlets.traitlets.Enum[builtins.int]
245+ )
246+ reveal_type (t .log_level ) # R: builtins.int
247+
248+
184249@pytest .mark .mypy_testing
185250def mypy_set_typing () -> None :
186251 class T (HasTraits ):
0 commit comments