File: wrappingCoverage.py

package info (click to toggle)
insighttoolkit5 5.2.1-5%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 550,276 kB
  • sloc: cpp: 757,652; ansic: 586,696; xml: 43,107; fortran: 34,788; python: 20,439; sh: 4,167; lisp: 2,158; tcl: 993; java: 362; yacc: 338; asm: 208; perl: 200; makefile: 197; csh: 195; lex: 184; javascript: 98; pascal: 71; ruby: 10
file content (105 lines) | stat: -rw-r--r-- 2,961 bytes parent folder | download
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# ==========================================================================
#
#   Copyright NumFOCUS
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#          http://www.apache.org/licenses/LICENSE-2.0.txt
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
# ==========================================================================*/

import sys
import re
import itk
import os
from optparse import OptionParser

parser = OptionParser(usage="wrappingCoverage.py paths")

parser.add_option(
    "-b",
    "--base",
    dest="base",
    default="Filter",
    help="Base string used to search for the classes (default: Filter).",
)
parser.add_option(
    "-e",
    "--exclude",
    dest="exclude",
    default=None,
    help="Path of a file with one class to exclude per line (default: None).",
)
parser.add_option(
    "-E",
    "--no-error",
    action="store_true",
    dest="noError",
    help="Don't generate an error code if all the classes are not wrapped.",
)

opts, args = parser.parse_args()

# declares classes which will not be wrapped
excluded = set([])
if opts.exclude:
    with open(opts.exclude, "r") as fp:
        to_exclude = [c.strip() for c in fp.readlines()]
        excluded.update(set(to_exclude))

# get classes from sources
headers = []
for d in args:
    headers += sum(
        [
            f
            for p, d, f in os.walk(d)
            if "Deprecated" not in p and "TestKernel" not in p
        ],
        [],
    )
classes = (
    set(
        [
            f[len("itk") : -len(".h")]
            for f in headers
            if f.startswith("itk")
            and not f.startswith("itkv3")
            and f.endswith(opts.base + ".h")
        ]
    )
    - excluded
)

# get filter from wrapper files
# remove classes which are not in the toolkit (external projects,
# PyImageFilter, ...)
wrapped = set([a for a in dir(itk) if a.endswith(opts.base)]).intersection(classes)

nonWrapped = classes - wrapped


# print non wrapped classes without much text to stdout, so they can be
# easily reused
for f in sorted(nonWrapped):
    print(f)

# and print stats in stderr to avoid poluting the list above
print("", file=sys.stderr)
print("%i %s" % (len(classes), opts.base), file=sys.stderr)
print("%i wrapped %s" % (len(wrapped), opts.base), file=sys.stderr)
print("%i non wrapped %s" % (len(nonWrapped), opts.base), file=sys.stderr)
covered = len(wrapped) / float(len(classes))
print(f"{covered * 100:f}% covered", file=sys.stderr)
print("", file=sys.stderr)

if not opts.noError:
    sys.exit(len(nonWrapped))