@@ -40,7 +40,7 @@ class Driver:
4040
4141 def __init__ (self , whitelist : List [str ], blacklist : List [str ],
4242 arglist : List [str ], verbosity : int , parallel_limit : int ,
43- xfail : List [str ]) -> None :
43+ xfail : List [str ], coverage : bool ) -> None :
4444 self .whitelist = whitelist
4545 self .blacklist = blacklist
4646 self .arglist = arglist
@@ -50,6 +50,7 @@ def __init__(self, whitelist: List[str], blacklist: List[str],
5050 self .cwd = os .getcwd ()
5151 self .mypy = os .path .join (self .cwd , 'scripts' , 'mypy' )
5252 self .env = dict (os .environ )
53+ self .coverage = coverage
5354
5455 def prepend_path (self , name : str , paths : List [str ]) -> None :
5556 old_val = self .env .get (name )
@@ -94,11 +95,15 @@ def add_mypy_package(self, name: str, packagename: str, *flags: str) -> None:
9495 def add_mypy_string (self , name : str , * args : str , cwd : Optional [str ] = None ) -> None :
9596 self .add_mypy_cmd (name , ['-c' ] + list (args ), cwd = cwd )
9697
97- def add_pytest (self , name : str , pytest_args : List [str ]) -> None :
98+ def add_pytest (self , name : str , pytest_args : List [str ], coverage : bool = False ) -> None :
9899 full_name = 'pytest %s' % name
99100 if not self .allow (full_name ):
100101 return
101- args = [sys .executable , '-m' , 'pytest' ] + pytest_args
102+ if coverage and self .coverage :
103+ args = [sys .executable , '-m' , 'pytest' , '--cov=mypy' ] + pytest_args
104+ else :
105+ args = [sys .executable , '-m' , 'pytest' ] + pytest_args
106+
102107 self .waiter .add (LazySubprocess (full_name , args , env = self .env ))
103108
104109 def add_python (self , name : str , * args : str , cwd : Optional [str ] = None ) -> None :
@@ -110,12 +115,16 @@ def add_python(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
110115 env = self .env
111116 self .waiter .add (LazySubprocess (name , largs , cwd = cwd , env = env ))
112117
113- def add_python_mod (self , name : str , * args : str , cwd : Optional [str ] = None ) -> None :
118+ def add_python_mod (self , name : str , * args : str , cwd : Optional [str ] = None ,
119+ coverage : bool = False ) -> None :
114120 name = 'run %s' % name
115121 if not self .allow (name ):
116122 return
117123 largs = list (args )
118- largs [0 :0 ] = [sys .executable , '-m' ]
124+ if coverage and self .coverage :
125+ largs [0 :0 ] = ['coverage' , 'run' , '-m' ]
126+ else :
127+ largs [0 :0 ] = [sys .executable , '-m' ]
119128 env = self .env
120129 self .waiter .add (LazySubprocess (name , largs , cwd = cwd , env = env ))
121130
@@ -203,7 +212,7 @@ def add_imports(driver: Driver) -> None:
203212
204213def add_pytest (driver : Driver ) -> None :
205214 for f in PYTEST_FILES :
206- driver .add_pytest (f , [f ] + driver .arglist )
215+ driver .add_pytest (f , [f ] + driver .arglist , True )
207216
208217
209218def add_myunit (driver : Driver ) -> None :
@@ -218,17 +227,20 @@ def add_myunit(driver: Driver) -> None:
218227 # This module has been converted to pytest; don't try to use myunit.
219228 pass
220229 else :
221- driver .add_python_mod ('unit-test %s' % mod , 'mypy.myunit' , '-m' , mod , * driver .arglist )
230+ driver .add_python_mod ('unit-test %s' % mod , 'mypy.myunit' , '-m' , mod ,
231+ * driver .arglist , coverage = True )
222232
223233
224234def add_pythoneval (driver : Driver ) -> None :
225235 driver .add_python_mod ('eval-test' , 'mypy.myunit' ,
226- '-m' , 'mypy.test.testpythoneval' , * driver .arglist )
236+ '-m' , 'mypy.test.testpythoneval' , * driver .arglist ,
237+ coverage = True )
227238
228239
229240def add_cmdline (driver : Driver ) -> None :
230241 driver .add_python_mod ('cmdline-test' , 'mypy.myunit' ,
231- '-m' , 'mypy.test.testcmdline' , * driver .arglist )
242+ '-m' , 'mypy.test.testcmdline' , * driver .arglist ,
243+ coverage = True )
232244
233245
234246def add_stubs (driver : Driver ) -> None :
@@ -288,6 +300,7 @@ def usage(status: int) -> None:
288300 print (' -l, --list list included tasks (after filtering) and exit' )
289301 print (' FILTER include tasks matching FILTER' )
290302 print (' -x, --exclude FILTER exclude tasks matching FILTER' )
303+ print (' -c, --coverage calculate code coverage while running tests' )
291304 print (' -- treat all remaining arguments as positional' )
292305 sys .exit (status )
293306
@@ -316,6 +329,7 @@ def main() -> None:
316329 blacklist = [] # type: List[str]
317330 arglist = [] # type: List[str]
318331 list_only = False
332+ coverage = False
319333
320334 allow_opts = True
321335 curlist = whitelist
@@ -340,6 +354,8 @@ def main() -> None:
340354 curlist = arglist
341355 elif a == '-l' or a == '--list' :
342356 list_only = True
357+ elif a == '-c' or a == '--coverage' :
358+ coverage = True
343359 elif a == '-h' or a == '--help' :
344360 usage (0 )
345361 else :
@@ -356,7 +372,7 @@ def main() -> None:
356372 whitelist .append ('' )
357373
358374 driver = Driver (whitelist = whitelist , blacklist = blacklist , arglist = arglist ,
359- verbosity = verbosity , parallel_limit = parallel_limit , xfail = [])
375+ verbosity = verbosity , parallel_limit = parallel_limit , xfail = [], coverage = coverage )
360376
361377 driver .prepend_path ('PATH' , [join (driver .cwd , 'scripts' )])
362378 driver .prepend_path ('MYPYPATH' , [driver .cwd ])
0 commit comments