1import os.path
2import sys
3from _pydevd_bundle.pydevd_constants import Null
4
5
6#=======================================================================================================================
7# get_coverage_files
8#=======================================================================================================================
9def get_coverage_files(coverage_output_dir, number_of_files):
10    base_dir = coverage_output_dir
11    ret = []
12    i = 0
13    while len(ret) < number_of_files:
14        while True:
15            f = os.path.join(base_dir, '.coverage.%s' % i)
16            i += 1
17            if not os.path.exists(f):
18                ret.append(f)
19                break #Break only inner for.
20    return ret
21
22
23#=======================================================================================================================
24# start_coverage_support
25#=======================================================================================================================
26def start_coverage_support(configuration):
27    return start_coverage_support_from_params(
28        configuration.coverage_output_dir,
29        configuration.coverage_output_file,
30        configuration.jobs,
31        configuration.coverage_include,
32    )
33
34
35#=======================================================================================================================
36# start_coverage_support_from_params
37#=======================================================================================================================
38def start_coverage_support_from_params(coverage_output_dir, coverage_output_file, jobs, coverage_include):
39    coverage_files = []
40    coverage_instance = Null()
41    if coverage_output_dir or coverage_output_file:
42        try:
43            import coverage #@UnresolvedImport
44        except:
45            sys.stderr.write('Error: coverage module could not be imported\n')
46            sys.stderr.write('Please make sure that the coverage module (http://nedbatchelder.com/code/coverage/)\n')
47            sys.stderr.write('is properly installed in your interpreter: %s\n' % (sys.executable,))
48
49            import traceback;traceback.print_exc()
50        else:
51            if coverage_output_dir:
52                if not os.path.exists(coverage_output_dir):
53                    sys.stderr.write('Error: directory for coverage output (%s) does not exist.\n' % (coverage_output_dir,))
54
55                elif not os.path.isdir(coverage_output_dir):
56                    sys.stderr.write('Error: expected (%s) to be a directory.\n' % (coverage_output_dir,))
57
58                else:
59                    n = jobs
60                    if n <= 0:
61                        n += 1
62                    n += 1 #Add 1 more for the current process (which will do the initial import).
63                    coverage_files = get_coverage_files(coverage_output_dir, n)
64                    os.environ['COVERAGE_FILE'] = coverage_files.pop(0)
65
66                    coverage_instance = coverage.coverage(source=[coverage_include])
67                    coverage_instance.start()
68
69            elif coverage_output_file:
70                #Client of parallel run.
71                os.environ['COVERAGE_FILE'] = coverage_output_file
72                coverage_instance = coverage.coverage(source=[coverage_include])
73                coverage_instance.start()
74
75    return coverage_files, coverage_instance
76
77