Sat, 22 Jan 2022 14:44:56 +0100
Upgraded coverage to version 6.2.0.
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
1 | # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
2 | # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
3 | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | """Execute files of Python code.""" |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
6 | import importlib.machinery |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
7 | import importlib.util |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
8 | import inspect |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
9 | import marshal |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
10 | import os |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
11 | import struct |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
12 | import sys |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
13 | import types |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
15 | from coverage import env |
8929
fcca2fa618bf
Upgraded coverage to version 6.2.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8775
diff
changeset
|
16 | from coverage.exceptions import CoverageException, _ExceptionDuringRun, NoCode, NoSource |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
17 | from coverage.files import canonical_filename, python_reported_file |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
18 | from coverage.misc import isolate_module |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
19 | from coverage.phystokens import compile_unicode |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
20 | from coverage.python import get_python_source |
29
391dc0bc4ae5
Updated coverage.py to version 3.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
0
diff
changeset
|
21 | |
5051
3586ebd9fac8
Updated coverage.py to version 4.1.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4489
diff
changeset
|
22 | os = isolate_module(os) |
3586ebd9fac8
Updated coverage.py to version 4.1.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4489
diff
changeset
|
23 | |
29
391dc0bc4ae5
Updated coverage.py to version 3.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
0
diff
changeset
|
24 | |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
25 | PYC_MAGIC_NUMBER = importlib.util.MAGIC_NUMBER |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
26 | |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
27 | class DummyLoader: |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
28 | """A shim for the pep302 __loader__, emulating pkgutil.ImpLoader. |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
29 | |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
30 | Currently only implements the .fullname attribute |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
31 | """ |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
32 | def __init__(self, fullname, *_args): |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
33 | self.fullname = fullname |
29
391dc0bc4ae5
Updated coverage.py to version 3.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
0
diff
changeset
|
34 | |
391dc0bc4ae5
Updated coverage.py to version 3.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
0
diff
changeset
|
35 | |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
36 | def find_module(modulename): |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
37 | """Find the module named `modulename`. |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
38 | |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
39 | Returns the file path of the module, the name of the enclosing |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
40 | package, and the spec. |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
41 | """ |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
42 | try: |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
43 | spec = importlib.util.find_spec(modulename) |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
44 | except ImportError as err: |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
45 | raise NoSource(str(err)) from err |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
46 | if not spec: |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
47 | raise NoSource(f"No module named {modulename!r}") |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
48 | pathname = spec.origin |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
49 | packagename = spec.name |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
50 | if spec.submodule_search_locations: |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
51 | mod_main = modulename + ".__main__" |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
52 | spec = importlib.util.find_spec(mod_main) |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
53 | if not spec: |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
54 | raise NoSource( |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
55 | f"No module named {mod_main}; " + |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
56 | f"{modulename!r} is a package and cannot be directly executed" |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
57 | ) |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
58 | pathname = spec.origin |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
59 | packagename = spec.name |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
60 | packagename = packagename.rpartition(".")[0] |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
61 | return pathname, packagename, spec |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
62 | |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
63 | |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
64 | class PyRunner: |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
65 | """Multi-stage execution of Python code. |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
66 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
67 | This is meant to emulate real Python execution as closely as possible. |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
68 | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | """ |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
70 | def __init__(self, args, as_module=False): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
71 | self.args = args |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
72 | self.as_module = as_module |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
73 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
74 | self.arg0 = args[0] |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
75 | self.package = self.modulename = self.pathname = self.loader = self.spec = None |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
76 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
77 | def prepare(self): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
78 | """Set sys.path properly. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
79 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
80 | This needs to happen before any importing, and without importing anything. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
81 | """ |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
82 | if self.as_module: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
83 | if env.PYBEHAVIOR.actual_syspath0_dash_m: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
84 | path0 = os.getcwd() |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
85 | else: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
86 | path0 = "" |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
87 | elif os.path.isdir(self.arg0): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
88 | # Running a directory means running the __main__.py file in that |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
89 | # directory. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
90 | path0 = self.arg0 |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
91 | else: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
92 | path0 = os.path.abspath(os.path.dirname(self.arg0)) |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
93 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
94 | if os.path.isdir(sys.path[0]): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
95 | # sys.path fakery. If we are being run as a command, then sys.path[0] |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
96 | # is the directory of the "coverage" script. If this is so, replace |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
97 | # sys.path[0] with the directory of the file we're running, or the |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
98 | # current directory when running modules. If it isn't so, then we |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
99 | # don't know what's going on, and just leave it alone. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
100 | top_file = inspect.stack()[-1][0].f_code.co_filename |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
101 | sys_path_0_abs = os.path.abspath(sys.path[0]) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
102 | top_file_dir_abs = os.path.abspath(os.path.dirname(top_file)) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
103 | sys_path_0_abs = canonical_filename(sys_path_0_abs) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
104 | top_file_dir_abs = canonical_filename(top_file_dir_abs) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
105 | if sys_path_0_abs != top_file_dir_abs: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
106 | path0 = None |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
107 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
108 | else: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
109 | # sys.path[0] is a file. Is the next entry the directory containing |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
110 | # that file? |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
111 | if sys.path[1] == os.path.dirname(sys.path[0]): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
112 | # Can it be right to always remove that? |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
113 | del sys.path[1] |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
115 | if path0 is not None: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
116 | sys.path[0] = python_reported_file(path0) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
117 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
118 | def _prepare2(self): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
119 | """Do more preparation to run Python code. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
120 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
121 | Includes finding the module to run and adjusting sys.argv[0]. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
122 | This method is allowed to import code. |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
124 | """ |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
125 | if self.as_module: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
126 | self.modulename = self.arg0 |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
127 | pathname, self.package, self.spec = find_module(self.modulename) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
128 | if self.spec is not None: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
129 | self.modulename = self.spec.name |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
130 | self.loader = DummyLoader(self.modulename) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
131 | self.pathname = os.path.abspath(pathname) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
132 | self.args[0] = self.arg0 = self.pathname |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
133 | elif os.path.isdir(self.arg0): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
134 | # Running a directory means running the __main__.py file in that |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
135 | # directory. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
136 | for ext in [".py", ".pyc", ".pyo"]: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
137 | try_filename = os.path.join(self.arg0, "__main__" + ext) |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
138 | # 3.8.10 changed how files are reported when running a |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
139 | # directory. But I'm not sure how far this change is going to |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
140 | # spread, so I'll just hard-code it here for now. |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
141 | if env.PYVERSION >= (3, 8, 10): |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
142 | try_filename = os.path.abspath(try_filename) |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
143 | if os.path.exists(try_filename): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
144 | self.arg0 = try_filename |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
145 | break |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
146 | else: |
8929
fcca2fa618bf
Upgraded coverage to version 6.2.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8775
diff
changeset
|
147 | raise NoSource(f"Can't find '__main__' module in '{self.arg0}'") |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
148 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
149 | # Make a spec. I don't know if this is the right way to do it. |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
150 | try_filename = python_reported_file(try_filename) |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
151 | self.spec = importlib.machinery.ModuleSpec("__main__", None, origin=try_filename) |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
152 | self.spec.has_location = True |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
153 | self.package = "" |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
154 | self.loader = DummyLoader("__main__") |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
155 | else: |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
156 | self.loader = DummyLoader("__main__") |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
157 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
158 | self.arg0 = python_reported_file(self.arg0) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
159 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
160 | def run(self): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
161 | """Run the Python code!""" |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
162 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
163 | self._prepare2() |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
164 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
165 | # Create a module to serve as __main__ |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
166 | main_mod = types.ModuleType('__main__') |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
167 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
168 | from_pyc = self.arg0.endswith((".pyc", ".pyo")) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
169 | main_mod.__file__ = self.arg0 |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
170 | if from_pyc: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
171 | main_mod.__file__ = main_mod.__file__[:-1] |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
172 | if self.package is not None: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
173 | main_mod.__package__ = self.package |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
174 | main_mod.__loader__ = self.loader |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
175 | if self.spec is not None: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
176 | main_mod.__spec__ = self.spec |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
177 | |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
178 | main_mod.__builtins__ = sys.modules['builtins'] |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
179 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
180 | sys.modules['__main__'] = main_mod |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
181 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
182 | # Set sys.argv properly. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
183 | sys.argv = self.args |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
184 | |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
185 | try: |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
186 | # Make a code object somehow. |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
187 | if from_pyc: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
188 | code = make_code_from_pyc(self.arg0) |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
189 | else: |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
190 | code = make_code_from_py(self.arg0) |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
191 | except CoverageException: |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
192 | raise |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
193 | except Exception as exc: |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
194 | msg = f"Couldn't run '{self.arg0}' as Python code: {exc.__class__.__name__}: {exc}" |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
195 | raise CoverageException(msg) from exc |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
196 | |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
197 | # Execute the code object. |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
198 | # Return to the original directory in case the test code exits in |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
199 | # a non-existent directory. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
200 | cwd = os.getcwd() |
29
391dc0bc4ae5
Updated coverage.py to version 3.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
0
diff
changeset
|
201 | try: |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
202 | exec(code, main_mod.__dict__) |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
203 | except SystemExit: # pylint: disable=try-except-raise |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
204 | # The user called sys.exit(). Just pass it along to the upper |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
205 | # layers, where it will be handled. |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
206 | raise |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
207 | except Exception: |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
208 | # Something went wrong while executing the user code. |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
209 | # Get the exc_info, and pack them into an exception that we can |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
210 | # throw up to the outer loop. We peel one layer off the traceback |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
211 | # so that the coverage.py code doesn't appear in the final printed |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
212 | # traceback. |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
213 | typ, err, tb = sys.exc_info() |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
214 | |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
215 | # PyPy3 weirdness. If I don't access __context__, then somehow it |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
216 | # is non-None when the exception is reported at the upper layer, |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
217 | # and a nested exception is shown to the user. This getattr fixes |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
218 | # it somehow? https://bitbucket.org/pypy/pypy/issue/1903 |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
219 | getattr(err, '__context__', None) |
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
220 | |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
221 | # Call the excepthook. |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
222 | try: |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
223 | err.__traceback__ = err.__traceback__.tb_next |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
224 | sys.excepthook(typ, err, tb.tb_next) |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
225 | except SystemExit: # pylint: disable=try-except-raise |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
226 | raise |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
227 | except Exception as exc: |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
228 | # Getting the output right in the case of excepthook |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
229 | # shenanigans is kind of involved. |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
230 | sys.stderr.write("Error in sys.excepthook:\n") |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
231 | typ2, err2, tb2 = sys.exc_info() |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
232 | err2.__suppress_context__ = True |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
233 | err2.__traceback__ = err2.__traceback__.tb_next |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
234 | sys.__excepthook__(typ2, err2, tb2.tb_next) |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
235 | sys.stderr.write("\nOriginal exception was:\n") |
8929
fcca2fa618bf
Upgraded coverage to version 6.2.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8775
diff
changeset
|
236 | raise _ExceptionDuringRun(typ, err, tb.tb_next) from exc |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
237 | else: |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
238 | sys.exit(1) |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
239 | finally: |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
240 | os.chdir(cwd) |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
241 | |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
242 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
243 | def run_python_module(args): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
244 | """Run a Python module, as though with ``python -m name args...``. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
245 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
246 | `args` is the argument array to present as sys.argv, including the first |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
247 | element naming the module being executed. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
248 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
249 | This is a helper for tests, to encapsulate how to use PyRunner. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
250 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
251 | """ |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
252 | runner = PyRunner(args, as_module=True) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
253 | runner.prepare() |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
254 | runner.run() |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
255 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
256 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
257 | def run_python_file(args): |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
258 | """Run a Python file as if it were the main program on the command line. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
259 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
260 | `args` is the argument array to present as sys.argv, including the first |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
261 | element naming the file being executed. `package` is the name of the |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
262 | enclosing package, if any. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
263 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
264 | This is a helper for tests, to encapsulate how to use PyRunner. |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
265 | |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
266 | """ |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
267 | runner = PyRunner(args, as_module=False) |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
268 | runner.prepare() |
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
269 | runner.run() |
29
391dc0bc4ae5
Updated coverage.py to version 3.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
0
diff
changeset
|
270 | |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
271 | |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
272 | def make_code_from_py(filename): |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
273 | """Get source from `filename` and make a code object of it.""" |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
274 | # Open the source file. |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
275 | try: |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
276 | source = get_python_source(filename) |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
277 | except (OSError, NoSource) as exc: |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
278 | raise NoSource(f"No file to run: '{filename}'") from exc |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
279 | |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
280 | code = compile_unicode(source, filename, "exec") |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
281 | return code |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
282 | |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
283 | |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
284 | def make_code_from_pyc(filename): |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
285 | """Get a code object from a .pyc file.""" |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
286 | try: |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
287 | fpyc = open(filename, "rb") |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
288 | except OSError as exc: |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
289 | raise NoCode(f"No file to run: '{filename}'") from exc |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
290 | |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
291 | with fpyc: |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
292 | # First four bytes are a version-specific magic number. It has to |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
293 | # match or we won't run the file. |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
294 | magic = fpyc.read(4) |
4489
d0d6e4ad31bd
Updated coverage to 4.0 (breaks with Python 3.2 support).
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3495
diff
changeset
|
295 | if magic != PYC_MAGIC_NUMBER: |
8929
fcca2fa618bf
Upgraded coverage to version 6.2.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8775
diff
changeset
|
296 | raise NoCode(f"Bad magic number in .pyc file: {magic!r} != {PYC_MAGIC_NUMBER!r}") |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
297 | |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
298 | date_based = True |
7427
362cd1b6f81a
coverage: updated coverage.py to 5.0.3.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
299 | if env.PYBEHAVIOR.hashed_pyc_pep552: |
6219
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
300 | flags = struct.unpack('<L', fpyc.read(4))[0] |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
301 | hash_based = flags & 0x01 |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
302 | if hash_based: |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
303 | fpyc.read(8) # Skip the hash. |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
304 | date_based = False |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
305 | if date_based: |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
306 | # Skip the junk in the header that we don't need. |
d6c795b5ce33
Third Party, coverage: updated coverage.py to 4.5.1.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5178
diff
changeset
|
307 | fpyc.read(4) # Skip the moddate. |
8775
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
308 | # 3.3 added another long to the header (size), skip it. |
0802ae193343
Upgraded coverage to 6.1.2.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
309 | fpyc.read(4) |
3495
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
310 | |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
311 | # The rest of the file is the code object we want. |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
312 | code = marshal.load(fpyc) |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
313 | |
fac17a82b431
updated coverage to 3.7.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
29
diff
changeset
|
314 | return code |