blob: 6eae36d6b9ab00263d611c42a81c49c46cf19df0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
"""Code unit (module) handling for Coverage."""
import os
from coverage.files import FileLocator
from coverage.plugin import FileReporter
class CodeUnit(FileReporter):
"""Code unit: a filename or module.
Instance attributes:
`name` is a human-readable name for this code unit.
`filename` is the os path from which we can read the source.
`relative` is a boolean.
"""
def __init__(self, morf, file_locator=None):
self.file_locator = file_locator or FileLocator()
if hasattr(morf, '__file__'):
filename = morf.__file__
else:
filename = morf
filename = self._adjust_filename(filename)
self.filename = self.file_locator.canonical_filename(filename)
if hasattr(morf, '__name__'):
name = morf.__name__
name = name.replace(".", os.sep) + ".py"
self.relative = True
else:
name = self.file_locator.relative_filename(filename)
if os.path.isabs(filename):
self.relative = (name != filename)
else:
self.relative = True
self.name = name
def _adjust_filename(self, f):
# TODO: This shouldn't be in the base class, right?
return f
def flat_rootname(self):
"""A base for a flat filename to correspond to this code unit.
Useful for writing files about the code where you want all the files in
the same directory, but need to differentiate same-named files from
different directories.
For example, the file a/b/c.py will return 'a_b_c_py'
"""
root = os.path.splitdrive(self.name)[1]
return root.replace('\\', '_').replace('/', '_').replace('.', '_')
|