summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2021-05-01 14:15:50 -0400
committerNed Batchelder <ned@nedbatchelder.com>2021-05-01 16:24:37 -0400
commit7db98362f368ac569edf66228d52cbc64a6d69aa (patch)
tree491c7c3736ca60ceeda3d29e3f4186954e3e572a
parent775c14a764ff3fd32bcd25d91f4c0f635722ed50 (diff)
downloadpython-coveragepy-git-7db98362f368ac569edf66228d52cbc64a6d69aa.tar.gz
refactor: remove yet more unneeded backward.py shims
Gone are: - PYC_MAGIC_NUMBER - code_object - SimpleNamespace
-rw-r--r--coverage/backward.py29
-rw-r--r--coverage/execfile.py17
-rw-r--r--coverage/html.py7
-rw-r--r--coverage/inorout.py4
-rw-r--r--tests/test_api.py4
5 files changed, 16 insertions, 45 deletions
diff --git a/coverage/backward.py b/coverage/backward.py
index 26d8d0e5..1169ff46 100644
--- a/coverage/backward.py
+++ b/coverage/backward.py
@@ -20,35 +20,6 @@ except Exception:
import imp
importlib_util_find_spec = None
-# What is the .pyc magic number for this version of Python?
-try:
- PYC_MAGIC_NUMBER = importlib.util.MAGIC_NUMBER
-except AttributeError:
- PYC_MAGIC_NUMBER = imp.get_magic()
-
-
-def code_object(fn):
- """Get the code object from a function."""
- try:
- return fn.func_code
- except AttributeError:
- return fn.__code__
-
-
-try:
- from types import SimpleNamespace
-except ImportError:
- # The code from https://docs.python.org/3/library/types.html#types.SimpleNamespace
- class SimpleNamespace:
- """Python implementation of SimpleNamespace, for Python 2."""
- def __init__(self, **kwargs):
- self.__dict__.update(kwargs)
-
- def __repr__(self):
- keys = sorted(self.__dict__)
- items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
- return "{}({})".format(type(self).__name__, ", ".join(items))
-
def format_local_datetime(dt):
"""Return a string with local timezone representing the date.
diff --git a/coverage/execfile.py b/coverage/execfile.py
index 32bb8223..600b2278 100644
--- a/coverage/execfile.py
+++ b/coverage/execfile.py
@@ -3,6 +3,8 @@
"""Execute files of Python code."""
+import importlib.machinery
+import importlib.util
import inspect
import marshal
import os
@@ -11,7 +13,7 @@ import sys
import types
from coverage import env
-from coverage.backward import PYC_MAGIC_NUMBER, imp, importlib_util_find_spec
+from coverage.backward import imp, importlib_util_find_spec
from coverage.files import canonical_filename, python_reported_file
from coverage.misc import CoverageException, ExceptionDuringRun, NoCode, NoSource, isolate_module
from coverage.phystokens import compile_unicode
@@ -20,6 +22,8 @@ from coverage.python import get_python_source
os = isolate_module(os)
+PYC_MAGIC_NUMBER = importlib.util.MAGIC_NUMBER
+
class DummyLoader(object):
"""A shim for the pep302 __loader__, emulating pkgutil.ImpLoader.
@@ -182,14 +186,9 @@ class PyRunner(object):
raise NoSource("Can't find '__main__' module in '%s'" % self.arg0)
# Make a spec. I don't know if this is the right way to do it.
- try:
- import importlib.machinery
- except ImportError:
- pass
- else:
- try_filename = python_reported_file(try_filename)
- self.spec = importlib.machinery.ModuleSpec("__main__", None, origin=try_filename)
- self.spec.has_location = True
+ try_filename = python_reported_file(try_filename)
+ self.spec = importlib.machinery.ModuleSpec("__main__", None, origin=try_filename)
+ self.spec.has_location = True
self.package = ""
self.loader = DummyLoader("__main__")
else:
diff --git a/coverage/html.py b/coverage/html.py
index 0093342a..aea1aa25 100644
--- a/coverage/html.py
+++ b/coverage/html.py
@@ -8,9 +8,10 @@ import json
import os
import re
import shutil
+import types
import coverage
-from coverage.backward import SimpleNamespace, format_local_datetime
+from coverage.backward import format_local_datetime
from coverage.data import add_data_to_hash
from coverage.files import flat_rootname
from coverage.misc import CoverageException, ensure_dir, file_be_gone, Hasher, isolate_module
@@ -129,7 +130,7 @@ class HtmlDataGeneration(object):
contexts_label = "{} ctx".format(len(contexts))
context_list = contexts
- lines.append(SimpleNamespace(
+ lines.append(types.SimpleNamespace(
tokens=tokens,
number=lineno,
category=category,
@@ -141,7 +142,7 @@ class HtmlDataGeneration(object):
long_annotations=long_annotations,
))
- file_data = SimpleNamespace(
+ file_data = types.SimpleNamespace(
relative_filename=fr.relative_filename(),
nums=analysis.numbers,
lines=lines,
diff --git a/coverage/inorout.py b/coverage/inorout.py
index 532634eb..554d34c4 100644
--- a/coverage/inorout.py
+++ b/coverage/inorout.py
@@ -13,7 +13,7 @@ import sysconfig
import traceback
from coverage import env
-from coverage.backward import code_object, importlib_util_find_spec
+from coverage.backward import importlib_util_find_spec
from coverage.disposition import FileDisposition, disposition_init
from coverage.files import TreeMatcher, FnmatchMatcher, ModuleMatcher
from coverage.files import prep_patterns, find_python_files, canonical_filename
@@ -162,7 +162,7 @@ def add_stdlib_paths(paths):
# objects still have the file names. So dig into one to find
# the path to exclude. The "filename" might be synthetic,
# don't be fooled by those.
- structseq_file = code_object(_structseq.structseq_new).co_filename
+ structseq_file = _structseq.structseq_new.__code__.co_filename
if not structseq_file.startswith("<"):
paths.add(canonical_path(structseq_file))
diff --git a/tests/test_api.py b/tests/test_api.py
index 6eff06fe..42ef986d 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -17,7 +17,7 @@ import pytest
import coverage
from coverage import env
-from coverage.backward import code_object, import_local_file
+from coverage.backward import import_local_file
from coverage.data import line_counts
from coverage.files import abs_file, relative_filename
from coverage.misc import CoverageException
@@ -269,7 +269,7 @@ class ApiTest(CoverageTest):
def f1():
a = 1 # pylint: disable=unused-variable
- one_line_number = code_object(f1).co_firstlineno + 1
+ one_line_number = f1.__code__.co_firstlineno + 1
lines = []
def run_one_function(f):