From 890afd7d52f11b1ccc90fd0c08e223429eaa024f Mon Sep 17 00:00:00 2001 From: mzfr Date: Sat, 13 May 2023 10:42:26 +0100 Subject: [PATCH] Add check for print statement --- README.md | 2 ++ kodi_addon_checker/check_addon.py | 2 ++ kodi_addon_checker/check_files.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/README.md b/README.md index 1ad4e72..743736e 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,8 @@ It can also be used locally for detecting problems in your addons. - Check if all PO files are valid +- Check if there exists any print statement in the addon. + All of the validation and checks are done according to the kodi [addon rules](https://kodi.wiki/view/Add-on_rules) ## Installation diff --git a/kodi_addon_checker/check_addon.py b/kodi_addon_checker/check_addon.py index 62bded4..e8b39ce 100644 --- a/kodi_addon_checker/check_addon.py +++ b/kodi_addon_checker/check_addon.py @@ -84,6 +84,8 @@ def start(addon_path, args, all_repo_addons, config=None): check_py3_compatibility.check_py3_compatibility(addon_report, addon_path, KodiVersion(args.branch)) + check_files.check_print_statement(addon_report, file_index) + if config.is_enabled("check_license_file_exists"): # check if license file is existing handle_files.addon_file_exists(addon_report, addon_path, diff --git a/kodi_addon_checker/check_files.py b/kodi_addon_checker/check_files.py index f516c53..8337f90 100644 --- a/kodi_addon_checker/check_files.py +++ b/kodi_addon_checker/check_files.py @@ -6,6 +6,7 @@ See LICENSES/README.md for more information. """ +import ast import json import os import re @@ -146,3 +147,31 @@ def check_file_permission(report: Report, file_index: list): file = os.path.join(file["path"], file["name"]) if os.path.isfile(file) and os.access(str(file), os.X_OK): report.add(Record(PROBLEM, f"{relative_path(str(file))} is marked as stand-alone executable")) + + +def check_print_statement(report: Report, file_index: list): + """Check whether any addon files have a print statement in them + or not + :file_index: list having names and path of all the files present in addon + """ + for file in file_index: + if os.path.splitext(file["name"])[1] == '.py': + file = os.path.join(file["path"], file["name"]) + try: + with open(file, 'r', encoding="utf-8") as f: + source = f.read() + + try: + for node in ast.walk(ast.parse(source)): + if (isinstance(node, ast.Expr) and + isinstance(node.value, ast.Call) and + isinstance(node.value.func, ast.Name)): + + if node.value.func.id == "print": + report.add(Record(WARNING, + f"{relative_path(str(file))} has a print statement on line {node.lineno}")) + except SyntaxError as e: + report.add(Record(PROBLEM, f"{relative_path(str(file))} failed to parse with {e}")) + + except UnicodeDecodeError as e: + report.add(Record(PROBLEM, f"UnicodeDecodeError: {e}"))