Files
create/tools/lint/qt_connections.py
2025-03-19 07:56:44 -05:00

76 lines
2.4 KiB
Python

#!/usr/bin/env python3
import argparse
import os
import re
import sys
from utils import (
add_common_arguments,
init_environment,
write_file,
append_file,
emit_problem_matchers,
)
def check_qt_connections(file_path):
"""
Scan the file for lines containing 'SIGNAL' or 'SLOT' and return a list of matching lines
with line numbers and a suggestion.
"""
matches = []
try:
with open(file_path, "r", encoding="utf-8", errors="replace") as f:
for lineno, line in enumerate(f, start=1):
if re.search(r"\b(SIGNAL|SLOT)\b", line):
matches.append(
f"{file_path}:{lineno}: {line.rstrip()} <-- Consider using functor-based connections"
)
except Exception as e:
logging.debug(f"Error reading {file_path}: {e}")
return matches
def generate_markdown_report(all_matches):
"""Generate a Markdown report based on the list of QT connection matches."""
count = len(all_matches)
if count > 0:
md_report = (
f"<details><summary>:information_source: Found {count} QT string-based connections → consider using QT functor-based connections</summary>\n"
"\nFor more information see: https://wiki.qt.io/New_Signal_Slot_Syntax or https://github.com/FreeCAD/FreeCAD/issues/6166\n"
"```\n" + "\n".join(all_matches) + "\n```\n</details>\n\n"
)
else:
md_report = ":heavy_check_mark: No string-based connections found\n\n"
return md_report
def main():
parser = argparse.ArgumentParser(
description="Check for old Qt string-based connections in files and append a Markdown report."
)
add_common_arguments(parser)
args = parser.parse_args()
init_environment(args)
all_matches = []
for file_path in args.files.split():
logging.debug(f"Checking file: {file_path}")
matches = check_qt_connections(file_path)
all_matches.extend(matches)
log_file = os.path.join(args.log_dir, "qtConnections.log")
write_file(log_file, "\n".join(all_matches))
emit_problem_matchers(log_file, "grepMatcherWarning.json", "grepMatcher-warning")
count = len(all_matches)
logging.info(f"Found {count} QT string-based connections")
md_report = generate_markdown_report(all_matches)
append_file(args.report_file, md_report)
sys.exit(0 if count == 0 else 1)
if __name__ == "__main__":
main()