mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			49 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								"""A minimal hook for gathering line coverage of the standard library.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Designed to be used with -Xpresite= which means:
							 | 
						||
| 
								 | 
							
								* it installs itself on import
							 | 
						||
| 
								 | 
							
								* it's not imported as `__main__` so can't use the ifmain idiom
							 | 
						||
| 
								 | 
							
								* it can't import anything besides `sys` to avoid tainting gathered coverage
							 | 
						||
| 
								 | 
							
								* filenames are not normalized
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To get gathered coverage back, look for 'test.cov' in `sys.modules`
							 | 
						||
| 
								 | 
							
								instead of importing directly. That way you can determine if the module
							 | 
						||
| 
								 | 
							
								was already in use.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you need to disable the hook, call the `disable()` function.
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mon = sys.monitoring
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FileName = str
							 | 
						||
| 
								 | 
							
								LineNo = int
							 | 
						||
| 
								 | 
							
								Location = tuple[FileName, LineNo]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								coverage: set[Location] = set()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# `types` and `typing` aren't imported to avoid invalid coverage
							 | 
						||
| 
								 | 
							
								def add_line(
							 | 
						||
| 
								 | 
							
								    code: "types.CodeType",
							 | 
						||
| 
								 | 
							
								    lineno: int,
							 | 
						||
| 
								 | 
							
								) -> "typing.Literal[sys.monitoring.DISABLE]":
							 | 
						||
| 
								 | 
							
								    coverage.add((code.co_filename, lineno))
							 | 
						||
| 
								 | 
							
								    return mon.DISABLE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def enable():
							 | 
						||
| 
								 | 
							
								    mon.use_tool_id(mon.COVERAGE_ID, "regrtest coverage")
							 | 
						||
| 
								 | 
							
								    mon.register_callback(mon.COVERAGE_ID, mon.events.LINE, add_line)
							 | 
						||
| 
								 | 
							
								    mon.set_events(mon.COVERAGE_ID, mon.events.LINE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def disable():
							 | 
						||
| 
								 | 
							
								    mon.set_events(mon.COVERAGE_ID, 0)
							 | 
						||
| 
								 | 
							
								    mon.register_callback(mon.COVERAGE_ID, mon.events.LINE, None)
							 | 
						||
| 
								 | 
							
								    mon.free_tool_id(mon.COVERAGE_ID)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enable()
							 |