@@ -40,7 +40,7 @@ class Driver:
40
40
41
41
def __init__ (self , whitelist : List [str ], blacklist : List [str ],
42
42
arglist : List [str ], verbosity : int , parallel_limit : int ,
43
- xfail : List [str ]) -> None :
43
+ xfail : List [str ], coverage : bool ) -> None :
44
44
self .whitelist = whitelist
45
45
self .blacklist = blacklist
46
46
self .arglist = arglist
@@ -50,6 +50,7 @@ def __init__(self, whitelist: List[str], blacklist: List[str],
50
50
self .cwd = os .getcwd ()
51
51
self .mypy = os .path .join (self .cwd , 'scripts' , 'mypy' )
52
52
self .env = dict (os .environ )
53
+ self .coverage = coverage
53
54
54
55
def prepend_path (self , name : str , paths : List [str ]) -> None :
55
56
old_val = self .env .get (name )
@@ -94,11 +95,15 @@ def add_mypy_package(self, name: str, packagename: str, *flags: str) -> None:
94
95
def add_mypy_string (self , name : str , * args : str , cwd : Optional [str ] = None ) -> None :
95
96
self .add_mypy_cmd (name , ['-c' ] + list (args ), cwd = cwd )
96
97
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 :
98
99
full_name = 'pytest %s' % name
99
100
if not self .allow (full_name ):
100
101
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
+
102
107
self .waiter .add (LazySubprocess (full_name , args , env = self .env ))
103
108
104
109
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:
110
115
env = self .env
111
116
self .waiter .add (LazySubprocess (name , largs , cwd = cwd , env = env ))
112
117
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 :
114
120
name = 'run %s' % name
115
121
if not self .allow (name ):
116
122
return
117
123
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' ]
119
128
env = self .env
120
129
self .waiter .add (LazySubprocess (name , largs , cwd = cwd , env = env ))
121
130
@@ -203,7 +212,7 @@ def add_imports(driver: Driver) -> None:
203
212
204
213
def add_pytest (driver : Driver ) -> None :
205
214
for f in PYTEST_FILES :
206
- driver .add_pytest (f , [f ] + driver .arglist )
215
+ driver .add_pytest (f , [f ] + driver .arglist , True )
207
216
208
217
209
218
def add_myunit (driver : Driver ) -> None :
@@ -218,17 +227,20 @@ def add_myunit(driver: Driver) -> None:
218
227
# This module has been converted to pytest; don't try to use myunit.
219
228
pass
220
229
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 )
222
232
223
233
224
234
def add_pythoneval (driver : Driver ) -> None :
225
235
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 )
227
238
228
239
229
240
def add_cmdline (driver : Driver ) -> None :
230
241
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 )
232
244
233
245
234
246
def add_stubs (driver : Driver ) -> None :
@@ -288,6 +300,7 @@ def usage(status: int) -> None:
288
300
print (' -l, --list list included tasks (after filtering) and exit' )
289
301
print (' FILTER include tasks matching FILTER' )
290
302
print (' -x, --exclude FILTER exclude tasks matching FILTER' )
303
+ print (' -c, --coverage calculate code coverage while running tests' )
291
304
print (' -- treat all remaining arguments as positional' )
292
305
sys .exit (status )
293
306
@@ -316,6 +329,7 @@ def main() -> None:
316
329
blacklist = [] # type: List[str]
317
330
arglist = [] # type: List[str]
318
331
list_only = False
332
+ coverage = False
319
333
320
334
allow_opts = True
321
335
curlist = whitelist
@@ -340,6 +354,8 @@ def main() -> None:
340
354
curlist = arglist
341
355
elif a == '-l' or a == '--list' :
342
356
list_only = True
357
+ elif a == '-c' or a == '--coverage' :
358
+ coverage = True
343
359
elif a == '-h' or a == '--help' :
344
360
usage (0 )
345
361
else :
@@ -356,7 +372,7 @@ def main() -> None:
356
372
whitelist .append ('' )
357
373
358
374
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 )
360
376
361
377
driver .prepend_path ('PATH' , [join (driver .cwd , 'scripts' )])
362
378
driver .prepend_path ('MYPYPATH' , [driver .cwd ])
0 commit comments