Coverage for tests / modules / process_test / try_execfile.py: 87.692%
45 statements
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
1# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2# For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
4"""Test file for run_python_file.
6This file is executed two ways::
8 $ coverage run try_execfile.py
10and::
12 $ python try_execfile.py
14The output is compared to see that the program execution context is the same
15under coverage and under Python.
17It is not crucial that the execution be identical, there are some differences
18that are OK. This program canonicalizes the output to gloss over those
19differences and get a clean diff.
21"""
23from __future__ import annotations 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
25import itertools 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
26import json 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
27import os 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
28import sys 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
30from typing import Any, List 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
32# sys.path varies by execution environments. Some installation libraries
33# removes duplicate entries from sys.path. So we do that too, since the extra
34# entries don't affect the running of the program.
37def same_file(p1: str, p2: str) -> bool: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
38 """Determine if `p1` and `p2` refer to the same existing file."""
39 if not p1: 39 ↛ 40line 39 didn't jump to line 40 because the condition on line 39 was never true1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
40 return not p2
41 if not os.path.exists(p1): 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
42 return False 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%
43 if not os.path.exists(p2): 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
44 return False 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%
45 if hasattr(os.path, "samefile"): 45 ↛ 48line 45 didn't jump to line 48 because the condition on line 45 was always true1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
46 return os.path.samefile(p1, p2) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
47 else:
48 norm1 = os.path.normcase(os.path.normpath(p1))
49 norm2 = os.path.normcase(os.path.normpath(p2))
50 return norm1 == norm2
53def without_same_files(filenames: List[str]) -> List[str]: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
54 """Return the list `filenames` with duplicates (by same_file) removed."""
55 reduced: List[str] = [] 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
56 for filename in filenames: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
57 if not any(same_file(filename, other) for other in reduced): 57 ↛ 56line 57 didn't jump to line 56 because the condition on line 57 was always true1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
58 reduced.append(filename) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
59 return reduced 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
62cleaned_sys_path = [os.path.normcase(p) for p in without_same_files(sys.path)] 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
64DATA = "xyzzy" 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
66import __main__ 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
69def my_function(a: Any) -> str: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
70 """A function to force execution of module-level values."""
71 return f"my_fn({a!r})" 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
74FN_VAL = my_function("fooey") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
76loader = globals().get("__loader__") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
77spec = globals().get("__spec__") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
79# A more compact ad-hoc grouped-by-first-letter list of builtins.
80CLUMPS = "ABC,DEF,GHI,JKLMN,OPQR,ST,U,VWXYZ_,ab,cd,efg,hij,lmno,pqr,stuvwxyz".split(",") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
83def word_group(w: str) -> int: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
84 """Figure out which CLUMP the first letter of w is in."""
85 for i, clump in enumerate(CLUMPS): 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
86 if w[0] in clump: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
87 return i 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
88 return 99 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%
91builtin_dir = [" ".join(s) for _, s in itertools.groupby(dir(__builtins__), key=word_group)] 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
93globals_to_check = { 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
94 "os.getcwd": os.getcwd(),
95 "__name__": __name__,
96 "__file__": os.path.normcase(__file__),
97 "__doc__": __doc__,
98 "__builtins__.has_open": hasattr(__builtins__, "open"),
99 "__builtins__.dir": builtin_dir,
100 "__loader__ exists": loader is not None,
101 "__package__": __package__,
102 "__spec__ exists": spec is not None,
103 "DATA": DATA,
104 "FN_VAL": FN_VAL,
105 "__main__.DATA": getattr(__main__, "DATA", "nothing"),
106 "argv0": sys.argv[0],
107 "argv1-n": sys.argv[1:],
108 "path": cleaned_sys_path,
109}
111if loader is not None: 111 ↛ 119line 111 didn't jump to line 119 because the condition on line 111 was always true1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
112 globals_to_check.update( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
113 {
114 "__loader__.fullname": getattr(loader, "fullname", None)
115 or getattr(loader, "name", None),
116 }
117 )
119if spec is not None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
120 globals_to_check.update( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()
121 {
122 "__spec__." + aname: getattr(spec, aname)
123 for aname in ["name", "origin", "submodule_search_locations", "parent", "has_location"]
124 }
125 )
127print(json.dumps(globals_to_check, indent=4, sort_keys=True)) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()