From 65a9211a451f3b0597fcc0a09975231e6c2ec028 Mon Sep 17 00:00:00 2001 From: cockroacher <163405488+cockroacher@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:12:10 +0100 Subject: [PATCH 1/6] pylint --- default.py | 124 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 54 deletions(-) diff --git a/default.py b/default.py index 93f04878..860758f1 100644 --- a/default.py +++ b/default.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import sys +import os import getopt import gettext from tests.utils import clean_cache_files @@ -7,10 +8,27 @@ def validate_test_type(test_types): - if utils.TEST_HTML in test_types and utils.TEST_PAGE_NOT_FOUND in test_types and utils.TEST_CSS in test_types and utils.TEST_WEBBKOLL in test_types and utils.TEST_GOOGLE_LIGHTHOUSE in test_types and utils.TEST_GOOGLE_LIGHTHOUSE_PWA in test_types and utils.TEST_GOOGLE_LIGHTHOUSE_A11Y in test_types and utils.TEST_GOOGLE_LIGHTHOUSE_SEO in test_types and utils.TEST_GOOGLE_LIGHTHOUSE_BEST_PRACTICE in test_types and utils.TEST_STANDARD_FILES in test_types and utils.TEST_YELLOW_LAB_TOOLS in test_types and utils.TEST_PA11Y in test_types and utils.TEST_HTTP in test_types and utils.TEST_ENERGY_EFFICIENCY in test_types and utils.TEST_TRACKING in test_types and utils.TEST_SITESPEED in test_types and utils.TEST_EMAIL in test_types and utils.TEST_SOFTWARE in test_types and utils.TEST_A11Y_STATEMENT in test_types: + if utils.TEST_HTML in test_types and \ + utils.TEST_PAGE_NOT_FOUND in test_types and \ + utils.TEST_CSS in test_types and \ + utils.TEST_WEBBKOLL in test_types and \ + utils.TEST_GOOGLE_LIGHTHOUSE in test_types and \ + utils.TEST_GOOGLE_LIGHTHOUSE_PWA in test_types and \ + utils.TEST_GOOGLE_LIGHTHOUSE_A11Y in test_types and \ + utils.TEST_GOOGLE_LIGHTHOUSE_SEO in test_types and \ + utils.TEST_GOOGLE_LIGHTHOUSE_BEST_PRACTICE in test_types and \ + utils.TEST_STANDARD_FILES in test_types and \ + utils.TEST_YELLOW_LAB_TOOLS in test_types and \ + utils.TEST_PA11Y in test_types and \ + utils.TEST_HTTP in test_types and \ + utils.TEST_ENERGY_EFFICIENCY in test_types and \ + utils.TEST_TRACKING in test_types and \ + utils.TEST_SITESPEED in test_types and \ + utils.TEST_EMAIL in test_types and \ + utils.TEST_SOFTWARE in test_types and \ + utils.TEST_A11Y_STATEMENT in test_types: return [] - else: - return test_types + return test_types def main(argv): @@ -42,23 +60,25 @@ def main(argv): show_help = False add_url = '' delete_url = '' - langCode = 'en' + lang_code = 'en' language = False # add support for default (en) language language = gettext.translation( - 'webperf-core', localedir='locales', languages=[langCode]) + 'webperf-core', localedir='locales', languages=[lang_code]) language.install() - _ = language.gettext + global_translation = language.gettext try: - opts, args = getopt.getopt(argv, "hu:t:i:o:rA:D:L:", [ - "help", "url=", "test=", "input=", "output=", "review", "report", "addUrl=", "deleteUrl=", "language=", "input-skip=", "input-take="]) + opts, _ = getopt.getopt(argv, "hu:t:i:o:rA:D:L:", [ + "help", "url=", "test=", "input=", "output=", + "review", "report", "addUrl=", "deleteUrl=", + "language=", "input-skip=", "input-take="]) except getopt.GetoptError: print(main.__doc__) sys.exit(2) - if (opts.__len__() == 0): + if len(opts) == 0: show_help = True for opt, arg in opts: @@ -72,40 +92,40 @@ def main(argv): delete_url = arg elif opt in ("-L", "--language"): # language code # loop all available languages and verify language exist - import os - availableLanguages = [] - localeDirs = os.listdir('locales') - foundLang = False + available_languages = [] + locale_dirs = os.listdir('locales') + found_lang = False - for localeName in localeDirs: - if (localeName[0:1] == '.'): + for locale_name in locale_dirs: + if locale_name[0:1] == '.': continue - languageSubDirectory = os.path.join( - 'locales', localeName, "LC_MESSAGES") + language_sub_directory = os.path.join( + 'locales', locale_name, "LC_MESSAGES") - if (os.path.exists(languageSubDirectory)): - availableLanguages.append(localeName) + if os.path.exists(language_sub_directory): + available_languages.append(locale_name) - if (localeName == arg): - langCode = arg - foundLang = True + if locale_name == arg: + lang_code = arg + found_lang = True language = gettext.translation( - 'webperf-core', localedir='locales', languages=[langCode]) + 'webperf-core', localedir='locales', languages=[lang_code]) language.install() _ = language.gettext - if (not foundLang): + if not found_lang: # Not translateable print( - 'Language not found, only the following languages are available:', availableLanguages) + 'Language not found, only the following languages are available:', + available_languages) sys.exit(2) elif opt in ("-t", "--test"): # test type try: tmp_test_types = list(map(int, arg.split(','))) test_types = validate_test_type(tmp_test_types) - except Exception: + except (TypeError, ValueError): test_types = [] if len(test_types) == 0: @@ -113,7 +133,8 @@ def main(argv): print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE')) print(global_translation('TEXT_TEST_VALID_ARGUMENTS_PAGE_NOT_FOUND')) print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_SEO')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_BEST_PRACTICE')) + print(global_translation( + 'TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_BEST_PRACTICE')) print(global_translation('TEXT_TEST_VALID_ARGUMENTS_HTML')) print(global_translation('TEXT_TEST_VALID_ARGUMENTS_CSS')) print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_PWA')) @@ -135,18 +156,18 @@ def main(argv): file_ending = "" file_long_ending = "" - if (len(input_filename) > 4): + if len(input_filename) > 4: file_ending = input_filename[-4:].lower() - if (len(input_filename) > 7): + if len(input_filename) > 7: file_long_ending = input_filename[-7:].lower() if file_long_ending == ".sqlite": from engines.sqlite import read_sites, add_site, delete_site - elif (file_ending == ".csv"): + elif file_ending == ".csv": from engines.csv import read_sites, add_site, delete_site - elif (file_ending == ".xml"): # https://example.com/sitemap.xml + elif file_ending == ".xml": # https://example.com/sitemap.xml from engines.sitemap import read_sites, add_site, delete_site - elif (file_long_ending == ".xml.gz"): # https://example.com/sitemap.xml.gz + elif file_long_ending == ".xml.gz": # https://example.com/sitemap.xml.gz from engines.sitemap import read_sites, add_site, delete_site elif file_long_ending == ".result": from engines.sitespeed_result import read_sites, add_site, delete_site @@ -154,54 +175,52 @@ def main(argv): from engines.webperf import read_sites, add_site, delete_site else: from engines.json import read_sites, add_site, delete_site - pass elif opt in ("--input-skip"): # specifies number of items to skip in the begining try: input_skip = int(arg) - except Exception: + except TypeError: print(global_translation('TEXT_COMMAND_USAGE')) sys.exit(2) - pass elif opt in ("--input-take"): # specifies number of items to take try: input_take = int(arg) - except Exception: + except TypeError: print(global_translation('TEXT_COMMAND_USAGE')) sys.exit(2) - pass elif opt in ("-o", "--output"): # output file path output_filename = arg - pass elif opt in ("-r", "--review", "--report"): # writes reviews directly in terminal show_reviews = True - pass - if (show_help): + if show_help: print(global_translation('TEXT_COMMAND_USAGE')) sys.exit() - if (input_filename != ''): + if input_filename != '': sites = read_sites(input_filename, input_skip, input_take) - if (add_url != ''): + if add_url != '': # check if website url should be added sites = add_site(input_filename, add_url, input_skip, input_take) - elif (delete_url != ''): + elif delete_url != '': # check if website url should be deleted sites = delete_site(input_filename, delete_url, input_skip, input_take) - elif (len(sites)): + elif len(sites) > 0: # run test(s) for every website - test_results = utils.test_sites(_, - langCode, sites, test_types=test_types, show_reviews=show_reviews) - - if (len(output_filename) > 0): + test_results = utils.test_sites(global_translation, + lang_code, + sites, + test_types=test_types, + show_reviews=show_reviews) + + if len(output_filename) > 0: file_ending = "" file_long_ending = "" - if (len(output_filename) > 4): + if len(output_filename) > 4: file_ending = output_filename[-4:].lower() - if (len(output_filename) > 7): + if len(output_filename) > 7: file_long_ending = output_filename[-7:].lower() - if (file_ending == ".csv"): + if file_ending == ".csv": from engines.csv import write_tests elif file_ending == ".gov": from engines.gov import write_tests @@ -220,8 +239,5 @@ def main(argv): print(global_translation('TEXT_COMMAND_USAGE')) -""" -If file is executed on itself then call a definition, mostly for testing purposes -""" if __name__ == '__main__': main(sys.argv[1:]) From 7cfc14bda3f9016bd953ae3a7f462efce980b214 Mon Sep 17 00:00:00 2001 From: cockroacher <163405488+cockroacher@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:42:11 +0100 Subject: [PATCH 2/6] pylint --- default.py | 255 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 155 insertions(+), 100 deletions(-) diff --git a/default.py b/default.py index 860758f1..5539081f 100644 --- a/default.py +++ b/default.py @@ -3,6 +3,29 @@ import os import getopt import gettext +from engines.sqlite import read_sites as sqlite_read_sites,\ + add_site as sqlite_add_site,\ + delete_site as sqlite_delete_site,\ + write_tests as sqlite_write_tests +from engines.csv import read_sites as csv_read_sites,\ + add_site as csv_add_site,\ + delete_site as csv_delete_site,\ + write_tests as csv_write_tests +from engines.sitemap import read_sites as sitemap_read_sites,\ + add_site as sitemap_add_site,\ + delete_site as sitemap_delete_site +from engines.sitespeed_result import read_sites as sitespeed_read_sites,\ + add_site as sitespeed_add_site,\ + delete_site as sitespeed_delete_site +from engines.webperf import read_sites as webperf_read_sites,\ + add_site as webperf_add_site,\ + delete_site as webperf_delete_site +from engines.json import read_sites as json_read_sites,\ + add_site as json_add_site,\ + delete_site as json_delete_site,\ + write_tests as json_write_tests +from engines.gov import write_tests as gov_write_tests +from engines.sql import write_tests as sql_write_tests from tests.utils import clean_cache_files import utils @@ -30,6 +53,127 @@ def validate_test_type(test_types): return [] return test_types +def show_help(global_translation): + print(global_translation('TEXT_COMMAND_USAGE')) + sys.exit() + +def write_test_results(sites, output_filename, test_results): + if len(output_filename) > 0: + file_ending = "" + file_long_ending = "" + if len(output_filename) > 4: + file_ending = output_filename[-4:].lower() + if len(output_filename) > 7: + file_long_ending = output_filename[-7:].lower() + if file_ending == ".csv": + write_tests = csv_write_tests + elif file_ending == ".gov": + write_tests = gov_write_tests + elif file_ending == ".sql": + write_tests = sql_write_tests + elif file_long_ending == ".sqlite": + write_tests = sqlite_write_tests + else: + write_tests = json_write_tests + + # use loaded engine to write tests + write_tests(output_filename, test_results, sites) + +def show_test_help(global_translation): + print(global_translation('TEXT_TEST_VALID_ARGUMENTS')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_PAGE_NOT_FOUND')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_SEO')) + print(global_translation( + 'TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_BEST_PRACTICE')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_HTML')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_CSS')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_PWA')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_STANDARD_FILES')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_A11Y')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_SITESPEED')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_YELLOW_LAB_TOOLS')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_PA11Y')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_WEBBKOLL')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_HTTP')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_ENERGY_EFFICIENCY')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_TRACKING')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_EMAIL')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_SOFTWARE')) + print(global_translation('TEXT_TEST_VALID_ARGUMENTS_A11Y_STATEMENT')) + sys.exit() + +def try_load_language(arg): + lang_code = 'en' + available_languages = [] + locale_dirs = os.listdir('locales') + found_lang = False + + for locale_name in locale_dirs: + if locale_name[0:1] == '.': + continue + + language_sub_directory = os.path.join( + 'locales', locale_name, "LC_MESSAGES") + + if os.path.exists(language_sub_directory): + available_languages.append(locale_name) + + if locale_name == arg: + lang_code = arg + found_lang = True + + language = gettext.translation( + 'webperf-core', localedir='locales', languages=[lang_code]) + language.install() + _ = language.gettext + + if not found_lang: + # Not translateable + print( + 'Language not found, only the following languages are available:', + available_languages) + sys.exit(2) + return lang_code + + +def get_site_input_handlers(input_filename): + file_ending = "" + file_long_ending = "" + if len(input_filename) > 4: + file_ending = input_filename[-4:].lower() + if len(input_filename) > 7: + file_long_ending = input_filename[-7:].lower() + + if file_long_ending == ".sqlite": + read_sites = sqlite_read_sites + add_site = sqlite_add_site + delete_site = sqlite_delete_site + elif file_ending == ".csv": + read_sites = csv_read_sites + add_site = csv_add_site + delete_site = csv_delete_site + elif file_ending == ".xml" or file_long_ending == ".xml.gz": + # https://example.com/sitemap.xml + # https://example.com/sitemap.xml.gz + read_sites = sitemap_read_sites + add_site = sitemap_add_site + delete_site = sitemap_delete_site + elif file_long_ending == ".result": + read_sites = sitespeed_read_sites + add_site = sitespeed_add_site + delete_site = sitespeed_delete_site + elif file_long_ending == ".webprf": + read_sites = webperf_read_sites + add_site = webperf_add_site + delete_site = webperf_delete_site + else: + read_sites = json_read_sites + add_site = json_add_site + delete_site = json_delete_site + return read_sites,add_site,delete_site + + def main(argv): """ @@ -57,7 +201,6 @@ def main(argv): input_skip = 0 input_take = -1 show_reviews = False - show_help = False add_url = '' delete_url = '' lang_code = 'en' @@ -79,12 +222,14 @@ def main(argv): sys.exit(2) if len(opts) == 0: - show_help = True + show_help(global_translation) + return for opt, arg in opts: if opt in ('-h', '--help'): # help - show_help = True - elif opt in ("-u", "--url"): # site url + show_help(global_translation) + return + if opt in ("-u", "--url"): # site url sites.append([0, arg]) elif opt in ("-A", "--addUrl"): # site url add_url = arg @@ -92,35 +237,7 @@ def main(argv): delete_url = arg elif opt in ("-L", "--language"): # language code # loop all available languages and verify language exist - available_languages = [] - locale_dirs = os.listdir('locales') - found_lang = False - - for locale_name in locale_dirs: - if locale_name[0:1] == '.': - continue - - language_sub_directory = os.path.join( - 'locales', locale_name, "LC_MESSAGES") - - if os.path.exists(language_sub_directory): - available_languages.append(locale_name) - - if locale_name == arg: - lang_code = arg - found_lang = True - - language = gettext.translation( - 'webperf-core', localedir='locales', languages=[lang_code]) - language.install() - _ = language.gettext - - if not found_lang: - # Not translateable - print( - 'Language not found, only the following languages are available:', - available_languages) - sys.exit(2) + lang_code = try_load_language(arg) elif opt in ("-t", "--test"): # test type try: tmp_test_types = list(map(int, arg.split(','))) @@ -129,52 +246,12 @@ def main(argv): test_types = [] if len(test_types) == 0: - print(global_translation('TEXT_TEST_VALID_ARGUMENTS')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_PAGE_NOT_FOUND')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_SEO')) - print(global_translation( - 'TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_BEST_PRACTICE')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_HTML')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_CSS')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_PWA')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_STANDARD_FILES')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE_A11Y')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_SITESPEED')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_YELLOW_LAB_TOOLS')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_PA11Y')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_WEBBKOLL')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_HTTP')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_ENERGY_EFFICIENCY')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_TRACKING')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_EMAIL')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_SOFTWARE')) - print(global_translation('TEXT_TEST_VALID_ARGUMENTS_A11Y_STATEMENT')) - sys.exit() + show_test_help(global_translation) + return elif opt in ("-i", "--input"): # input file path input_filename = arg - file_ending = "" - file_long_ending = "" - if len(input_filename) > 4: - file_ending = input_filename[-4:].lower() - if len(input_filename) > 7: - file_long_ending = input_filename[-7:].lower() - - if file_long_ending == ".sqlite": - from engines.sqlite import read_sites, add_site, delete_site - elif file_ending == ".csv": - from engines.csv import read_sites, add_site, delete_site - elif file_ending == ".xml": # https://example.com/sitemap.xml - from engines.sitemap import read_sites, add_site, delete_site - elif file_long_ending == ".xml.gz": # https://example.com/sitemap.xml.gz - from engines.sitemap import read_sites, add_site, delete_site - elif file_long_ending == ".result": - from engines.sitespeed_result import read_sites, add_site, delete_site - elif file_long_ending == ".webprf": - from engines.webperf import read_sites, add_site, delete_site - else: - from engines.json import read_sites, add_site, delete_site + read_sites, add_site, delete_site = get_site_input_handlers(input_filename) elif opt in ("--input-skip"): # specifies number of items to skip in the begining try: input_skip = int(arg) @@ -192,10 +269,6 @@ def main(argv): elif opt in ("-r", "--review", "--report"): # writes reviews directly in terminal show_reviews = True - if show_help: - print(global_translation('TEXT_COMMAND_USAGE')) - sys.exit() - if input_filename != '': sites = read_sites(input_filename, input_skip, input_take) @@ -213,31 +286,13 @@ def main(argv): test_types=test_types, show_reviews=show_reviews) - if len(output_filename) > 0: - file_ending = "" - file_long_ending = "" - if len(output_filename) > 4: - file_ending = output_filename[-4:].lower() - if len(output_filename) > 7: - file_long_ending = output_filename[-7:].lower() - if file_ending == ".csv": - from engines.csv import write_tests - elif file_ending == ".gov": - from engines.gov import write_tests - elif file_ending == ".sql": - from engines.sql import write_tests - elif file_long_ending == ".sqlite": - from engines.sqlite import write_tests - else: - from engines.json import write_tests - - # use loaded engine to write tests - write_tests(output_filename, test_results, sites) + write_test_results(sites, output_filename, test_results) # Cleanup exipred cache clean_cache_files() else: print(global_translation('TEXT_COMMAND_USAGE')) + if __name__ == '__main__': main(sys.argv[1:]) From 2bc046af8b54d1cf4b2e584aae4b414ea7d7198e Mon Sep 17 00:00:00 2001 From: cockroacher <163405488+cockroacher@users.noreply.github.com> Date: Tue, 26 Mar 2024 18:20:07 +0100 Subject: [PATCH 3/6] pylint --- default.py | 365 ++++++++++++++++++++++++++++------------------------- 1 file changed, 196 insertions(+), 169 deletions(-) diff --git a/default.py b/default.py index 5539081f..bb17a5ce 100644 --- a/default.py +++ b/default.py @@ -30,32 +30,15 @@ import utils -def validate_test_type(test_types): - if utils.TEST_HTML in test_types and \ - utils.TEST_PAGE_NOT_FOUND in test_types and \ - utils.TEST_CSS in test_types and \ - utils.TEST_WEBBKOLL in test_types and \ - utils.TEST_GOOGLE_LIGHTHOUSE in test_types and \ - utils.TEST_GOOGLE_LIGHTHOUSE_PWA in test_types and \ - utils.TEST_GOOGLE_LIGHTHOUSE_A11Y in test_types and \ - utils.TEST_GOOGLE_LIGHTHOUSE_SEO in test_types and \ - utils.TEST_GOOGLE_LIGHTHOUSE_BEST_PRACTICE in test_types and \ - utils.TEST_STANDARD_FILES in test_types and \ - utils.TEST_YELLOW_LAB_TOOLS in test_types and \ - utils.TEST_PA11Y in test_types and \ - utils.TEST_HTTP in test_types and \ - utils.TEST_ENERGY_EFFICIENCY in test_types and \ - utils.TEST_TRACKING in test_types and \ - utils.TEST_SITESPEED in test_types and \ - utils.TEST_EMAIL in test_types and \ - utils.TEST_SOFTWARE in test_types and \ - utils.TEST_A11Y_STATEMENT in test_types: - return [] - return test_types +def validate_test_type(tmp_test_types): + test_types = [] -def show_help(global_translation): - print(global_translation('TEXT_COMMAND_USAGE')) - sys.exit() + valid_tests = utils.TEST_FUNCS.keys() + for test_type in tmp_test_types: + if test_type in valid_tests: + test_types.append(test_type) + + return test_types def write_test_results(sites, output_filename, test_results): if len(output_filename) > 0: @@ -103,76 +86,165 @@ def show_test_help(global_translation): print(global_translation('TEXT_TEST_VALID_ARGUMENTS_A11Y_STATEMENT')) sys.exit() -def try_load_language(arg): + +class CommandLineOptions: # pylint: disable=too-many-instance-attributes + test_types = list(utils.TEST_ALL) + sites = [] + output_filename = '' + input_filename = '' + input_skip = 0 + input_take = -1 + show_reviews = False + add_url = '' + delete_url = '' lang_code = 'en' - available_languages = [] - locale_dirs = os.listdir('locales') - found_lang = False - - for locale_name in locale_dirs: - if locale_name[0:1] == '.': - continue - - language_sub_directory = os.path.join( - 'locales', locale_name, "LC_MESSAGES") - - if os.path.exists(language_sub_directory): - available_languages.append(locale_name) - - if locale_name == arg: - lang_code = arg - found_lang = True - - language = gettext.translation( - 'webperf-core', localedir='locales', languages=[lang_code]) - language.install() - _ = language.gettext - - if not found_lang: - # Not translateable - print( - 'Language not found, only the following languages are available:', - available_languages) - sys.exit(2) - return lang_code - - -def get_site_input_handlers(input_filename): - file_ending = "" - file_long_ending = "" - if len(input_filename) > 4: - file_ending = input_filename[-4:].lower() - if len(input_filename) > 7: - file_long_ending = input_filename[-7:].lower() - - if file_long_ending == ".sqlite": - read_sites = sqlite_read_sites - add_site = sqlite_add_site - delete_site = sqlite_delete_site - elif file_ending == ".csv": - read_sites = csv_read_sites - add_site = csv_add_site - delete_site = csv_delete_site - elif file_ending == ".xml" or file_long_ending == ".xml.gz": - # https://example.com/sitemap.xml - # https://example.com/sitemap.xml.gz - read_sites = sitemap_read_sites - add_site = sitemap_add_site - delete_site = sitemap_delete_site - elif file_long_ending == ".result": - read_sites = sitespeed_read_sites - add_site = sitespeed_add_site - delete_site = sitespeed_delete_site - elif file_long_ending == ".webprf": - read_sites = webperf_read_sites - add_site = webperf_add_site - delete_site = webperf_delete_site - else: - read_sites = json_read_sites - add_site = json_add_site - delete_site = json_delete_site - return read_sites,add_site,delete_site + language = False + + read_sites = None + add_site = None + delete_site = None + + def __init__(self): + self.lang_code = 'en' + + def show_help(self, _): + print(self.language('TEXT_COMMAND_USAGE')) + sys.exit() + + def load_language(self, lang_code): + trans = gettext.translation( + 'webperf-core', localedir='locales', languages=[lang_code]) + trans.install() + self.language = trans.gettext + return self.language + + def use_url(self, arg): + self.sites.append([0, arg]) + + def add_site_url(self, arg): + self.add_url = arg + + def delete_site_url(self, arg): + self.delete_url = arg + + def set_input_skip(self, arg): + try: + self.input_skip = int(arg) + except TypeError: + print(self.language('TEXT_COMMAND_USAGE')) + sys.exit(2) + + def set_input_take(self, arg): + try: + self.input_take = int(arg) + except TypeError: + print(self.language('TEXT_COMMAND_USAGE')) + sys.exit(2) + + def set_output_filename(self, arg): + self.output_filename = arg + + def set_test_types(self, arg): + try: + tmp_test_types = list(map(int, arg.split(','))) + self.test_types = validate_test_type(tmp_test_types) + except (TypeError, ValueError): + self.test_types = [] + + if len(self.test_types) == 0: + show_test_help(self.language) + return + + def enable_reviews(self, _): + self.show_reviews = True + def set_input_handlers(self, input_filename): + file_ending = "" + file_long_ending = "" + if len(input_filename) > 4: + file_ending = input_filename[-4:].lower() + if len(input_filename) > 7: + file_long_ending = input_filename[-7:].lower() + + if file_long_ending == ".sqlite": + read_sites = sqlite_read_sites + add_site = sqlite_add_site + delete_site = sqlite_delete_site + elif file_ending == ".csv": + read_sites = csv_read_sites + add_site = csv_add_site + delete_site = csv_delete_site + elif file_ending == ".xml" or file_long_ending == ".xml.gz": + # https://example.com/sitemap.xml + # https://example.com/sitemap.xml.gz + read_sites = sitemap_read_sites + add_site = sitemap_add_site + delete_site = sitemap_delete_site + elif file_long_ending == ".result": + read_sites = sitespeed_read_sites + add_site = sitespeed_add_site + delete_site = sitespeed_delete_site + elif file_long_ending == ".webprf": + read_sites = webperf_read_sites + add_site = webperf_add_site + delete_site = webperf_delete_site + else: + read_sites = json_read_sites + add_site = json_add_site + delete_site = json_delete_site + self.read_sites = read_sites + self.add_site = add_site + self.delete_site = delete_site + + + def try_load_language(self, arg): + lang_code = 'en' + available_languages = [] + locale_dirs = os.listdir('locales') + found_lang = False + + for locale_name in locale_dirs: + if locale_name[0:1] == '.': + continue + + language_sub_directory = os.path.join( + 'locales', locale_name, "LC_MESSAGES") + + if os.path.exists(language_sub_directory): + available_languages.append(locale_name) + + if locale_name == arg: + self.lang_code = arg + found_lang = True + + self.load_language(lang_code) + + if not found_lang: + # Not translateable + print( + 'Language not found, only the following languages are available:', + available_languages) + sys.exit(2) + + def handle_option(self, opt, arg): + option_handlers = { + ("-h", "--help"): self.show_help, + ("-u", "--url"): self.use_url, + ("-A", "--addUrl"): self.add_site_url, + ("-D", "--deleteUrl"): self.delete_site_url, + ("-L", "--language"): self.try_load_language, + ("-t", "--test"): self.set_test_types, + ("-i", "--input"): self.set_input_handlers, + ("--input-skip"): self.set_input_skip, + ("--input-take"): self.set_input_take, + ("-o", "--output"): self.set_output_filename, + ("-r", "--review", "--report"): self.enable_reviews, + } + + for option, handler in option_handlers.items(): + if opt in option: + handler(arg) + return def main(argv): @@ -194,23 +266,8 @@ def main(argv): -L/--language \t: language used for output(en = default/sv) """ - test_types = list(utils.TEST_ALL) - sites = [] - output_filename = '' - input_filename = '' - input_skip = 0 - input_take = -1 - show_reviews = False - add_url = '' - delete_url = '' - lang_code = 'en' - language = False - - # add support for default (en) language - language = gettext.translation( - 'webperf-core', localedir='locales', languages=[lang_code]) - language.install() - global_translation = language.gettext + options = CommandLineOptions() + options.load_language(options.lang_code) try: opts, _ = getopt.getopt(argv, "hu:t:i:o:rA:D:L:", [ @@ -222,75 +279,45 @@ def main(argv): sys.exit(2) if len(opts) == 0: - show_help(global_translation) + options.show_help(_) return for opt, arg in opts: - if opt in ('-h', '--help'): # help - show_help(global_translation) - return - if opt in ("-u", "--url"): # site url - sites.append([0, arg]) - elif opt in ("-A", "--addUrl"): # site url - add_url = arg - elif opt in ("-D", "--deleteUrl"): # site url - delete_url = arg - elif opt in ("-L", "--language"): # language code - # loop all available languages and verify language exist - lang_code = try_load_language(arg) - elif opt in ("-t", "--test"): # test type - try: - tmp_test_types = list(map(int, arg.split(','))) - test_types = validate_test_type(tmp_test_types) - except (TypeError, ValueError): - test_types = [] - - if len(test_types) == 0: - show_test_help(global_translation) - return - elif opt in ("-i", "--input"): # input file path - input_filename = arg - - read_sites, add_site, delete_site = get_site_input_handlers(input_filename) - elif opt in ("--input-skip"): # specifies number of items to skip in the begining - try: - input_skip = int(arg) - except TypeError: - print(global_translation('TEXT_COMMAND_USAGE')) - sys.exit(2) - elif opt in ("--input-take"): # specifies number of items to take - try: - input_take = int(arg) - except TypeError: - print(global_translation('TEXT_COMMAND_USAGE')) - sys.exit(2) - elif opt in ("-o", "--output"): # output file path - output_filename = arg - elif opt in ("-r", "--review", "--report"): # writes reviews directly in terminal - show_reviews = True - - if input_filename != '': - sites = read_sites(input_filename, input_skip, input_take) - - if add_url != '': + options.handle_option(opt, arg) + + if options.input_filename != '': + options.sites = options.read_sites( + options.input_filename, + options.input_skip, + options.input_take) + + if options.add_url != '': # check if website url should be added - sites = add_site(input_filename, add_url, input_skip, input_take) - elif delete_url != '': + options.sites = options.add_site( + options.input_filename, + options.add_url, + options.input_skip, + options.input_take) + elif options.delete_url != '': # check if website url should be deleted - sites = delete_site(input_filename, delete_url, input_skip, input_take) - elif len(sites) > 0: + options.sites = options.delete_site( + options.input_filename, + options.delete_url, + options.input_skip, + options.input_take) + elif len(options.sites) > 0: # run test(s) for every website - test_results = utils.test_sites(global_translation, - lang_code, - sites, - test_types=test_types, - show_reviews=show_reviews) + test_results = utils.test_sites(options.language, + options.lang_code, + options.sites, + test_types=options.test_types, + show_reviews=options.show_reviews) - write_test_results(sites, output_filename, test_results) + write_test_results(options.sites, options.output_filename, test_results) # Cleanup exipred cache clean_cache_files() else: - print(global_translation('TEXT_COMMAND_USAGE')) + print(options.language('TEXT_COMMAND_USAGE')) From 21af3225b711271d9ccf7dac91d546a1696cd867 Mon Sep 17 00:00:00 2001 From: cockroacher <163405488+cockroacher@users.noreply.github.com> Date: Tue, 26 Mar 2024 18:24:20 +0100 Subject: [PATCH 4/6] fix for SyntaxError --- utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/utils.py b/utils.py index e2c7b112..dce202dc 100644 --- a/utils.py +++ b/utils.py @@ -172,9 +172,9 @@ def test(global_translation, lang_code, site, test_type=None, show_reviews=False with open('failures.log', 'a', encoding='utf-8') as outfile: outfile.writelines(['###############################################', '\n# Information:', - f'\nDateTime: { - datetime.now().strftime('%Y-%m-%d %H:%M:%S') - }', + f"\nDateTime: { \ + datetime.now().strftime('%Y-%m-%d %H:%M:%S') \ + }", f'\nUrl: {site[1]}', f'\nLanguage Code: {lang_code}', f'\nTest Type(s): {test_type}', @@ -184,9 +184,9 @@ def test(global_translation, lang_code, site, test_type=None, show_reviews=False f"\nuseragent: {get_config('USERAGENT')}", f"\nhttp_request_timeout: {get_config('HTTP_REQUEST_TIMEOUT')}", f"\nwebbkoll_sleep: {get_config('WEBBKOLL_SLEEP')}", - f"\ncss_review_group_errors: { + f"\ncss_review_group_errors: { \ get_config('CSS_REVIEW_GROUP_ERRORS')}", - f"\nreview_show_improvements_only: { + f"\nreview_show_improvements_only: { \ get_config('REVIEW_SHOW_IMPROVEMENTS_ONLY')}", f"\nylt_use_api: {get_config('YLT_USE_API')}", f"\nlighthouse_use_api: {get_config('LIGHTHOUSE_USE_API')}", From 1ce1132d04fda14e71355c7edaf426aa776e7eda Mon Sep 17 00:00:00 2001 From: cockroacher <163405488+cockroacher@users.noreply.github.com> Date: Tue, 26 Mar 2024 19:48:08 +0100 Subject: [PATCH 5/6] pylint docstring for methods --- default.py | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 191 insertions(+), 1 deletion(-) diff --git a/default.py b/default.py index bb17a5ce..e918f1c5 100644 --- a/default.py +++ b/default.py @@ -31,6 +31,24 @@ def validate_test_type(tmp_test_types): + """ + Validates the given test types against a list of valid tests. + + This function iterates over the input list of test types, + checks each test type against a list of valid tests, + and appends the valid ones to a new list. + The new list of valid test types is then returned. + + Parameters: + tmp_test_types (list): A list of test types to be validated. + + Returns: + list: A list of valid test types. + + Example: + >>> validate_test_type([6, 11, 21]) + [6, 21] + """ test_types = [] valid_tests = utils.TEST_FUNCS.keys() @@ -41,6 +59,22 @@ def validate_test_type(tmp_test_types): return test_types def write_test_results(sites, output_filename, test_results): + """ + Writes the test results to a file. + + This function takes in a list of sites, an output filename, + and a list of test results. It determines the file type + based on the file extension of the output filename and writes the test results to + the file in the appropriate format. + + Parameters: + sites (list): A list of sites for which the tests were run. + output_filename (str): The name of the output file. + test_results (list): A list of test results. + + Returns: + None + """ if len(output_filename) > 0: file_ending = "" file_long_ending = "" @@ -63,6 +97,26 @@ def write_test_results(sites, output_filename, test_results): write_tests(output_filename, test_results, sites) def show_test_help(global_translation): + """ + Prints out help text for various test arguments. + + This function uses the provided global translation function to + print out help text for a variety of test arguments. + The help text includes information about valid arguments for + different types of tests such as Google Lighthouse, HTML, CSS, + Sitespeed, Yellow Lab Tools, Pa11y, Webbkoll, HTTP, Energy Efficiency, + Tracking, Email, Software, and A11Y Statement. + + Args: + global_translation (function): A function that takes a string identifier and + returns the corresponding translated string. + + Returns: + None + + Raises: + SystemExit: This function always ends the program after printing the help text. + """ print(global_translation('TEXT_TEST_VALID_ARGUMENTS')) print(global_translation('TEXT_TEST_VALID_ARGUMENTS_GOOGLE_LIGHTHOUSE')) print(global_translation('TEXT_TEST_VALID_ARGUMENTS_PAGE_NOT_FOUND')) @@ -87,7 +141,7 @@ def show_test_help(global_translation): sys.exit() -class CommandLineOptions: # pylint: disable=too-many-instance-attributes +class CommandLineOptions: # pylint: disable=too-many-instance-attributes,missing-class-docstring test_types = list(utils.TEST_ALL) sites = [] output_filename = '' @@ -108,10 +162,25 @@ def __init__(self): self.lang_code = 'en' def show_help(self, _): + """ + Prints out the command usage help text and exits the program. + + This function uses the provided language function to print out help text for command usage. + After printing the help text, it ends the program. + """ print(self.language('TEXT_COMMAND_USAGE')) sys.exit() def load_language(self, lang_code): + """ + Load the specified language for translation. + + Parameters: + lang_code (str): The language code for the desired language. + + Returns: + function: The translation function for the specified language. + """ trans = gettext.translation( 'webperf-core', localedir='locales', languages=[lang_code]) trans.install() @@ -119,15 +188,40 @@ def load_language(self, lang_code): return self.language def use_url(self, arg): + """ + Uses supplied url in test(s) + """ self.sites.append([0, arg]) def add_site_url(self, arg): + """ + Adds the url to stored sites + """ self.add_url = arg def delete_site_url(self, arg): + """ + Deletes the url from stored sites + """ self.delete_url = arg def set_input_skip(self, arg): + """ + Sets the input skip for the instance. + This function attempts to parse the provided argument as an integer and + assigns it as the input skip for the instance. + If the argument cannot be parsed into an integer, + the function prints a usage message and exits the program. + + Args: + arg (str): The desired input skip as a string. + + Raises: + TypeError: If the argument cannot be parsed into an integer. + + Returns: + None + """ try: self.input_skip = int(arg) except TypeError: @@ -135,6 +229,22 @@ def set_input_skip(self, arg): sys.exit(2) def set_input_take(self, arg): + """ + Sets the input take for the instance. + This function attempts to parse the provided argument as an integer and + assigns it as the input take for the instance. + If the argument cannot be parsed into an integer, + the function prints a usage message and exits the program. + + Args: + arg (str): The desired input take as a string. + + Raises: + TypeError: If the argument cannot be parsed into an integer. + + Returns: + None + """ try: self.input_take = int(arg) except TypeError: @@ -142,9 +252,33 @@ def set_input_take(self, arg): sys.exit(2) def set_output_filename(self, arg): + """ + Sets the output filename for the instance. + This function assigns the provided argument as the output filename for the instance. + + Args: + arg (str): The desired output filename. + + Returns: + None + """ self.output_filename = arg def set_test_types(self, arg): + """ + Sets the test types for the instance based on the provided argument. + + The function attempts to parse the argument as a comma-separated string of integers. + These integers are then validated as test types. If the parsing or validation fails, + the test types for the instance are set to an empty list. If no valid test types are + provided, the function displays a help message for tests. + + Args: + arg (str): A comma-separated string of integers representing test types. + + Returns: + None + """ try: tmp_test_types = list(map(int, arg.split(','))) self.test_types = validate_test_type(tmp_test_types) @@ -156,9 +290,34 @@ def set_test_types(self, arg): return def enable_reviews(self, _): + """ + Enables the display of reviews for the instance. + This function sets the `show_reviews` attribute of the instance to True, + enabling the display of reviews. + + Args: + _ (Any): This argument is not used in the function. + + Returns: + None + """ self.show_reviews = True def set_input_handlers(self, input_filename): + """ + Sets the appropriate input handlers based on the file type of the input file. + + This function checks the file extension of the input file and + sets the appropriate functions to read sites, add a site, and delete a site. + The supported file types are SQLite, CSV, XML, Result, Webprf, and JSON. + If the file type is not recognized, it defaults to JSON. + + Args: + input_filename (str): The name of the input file. + + Returns: + None + """ file_ending = "" file_long_ending = "" if len(input_filename) > 4: @@ -198,6 +357,23 @@ def set_input_handlers(self, input_filename): def try_load_language(self, arg): + """ + Attempts to load the specified language for translation. + + This function checks if the specified language is available in the 'locales' directory. + If it is, it sets the language code and loads the language. + If the specified language is not available, + it prints out a message listing the available languages and exits the program. + + Args: + arg (str): The language code for the desired language. + + Returns: + None + + Raises: + SystemExit: This function ends the program if the specified language is not available. + """ lang_code = 'en' available_languages = [] locale_dirs = os.listdir('locales') @@ -227,6 +403,20 @@ def try_load_language(self, arg): sys.exit(2) def handle_option(self, opt, arg): + """ + Handles the provided option by calling the appropriate handler function. + + This function uses a dictionary to map options to their corresponding handler functions. + It checks if the provided option matches any of the keys in the dictionary. + If a match is found, it calls the corresponding handler function with the provided argument. + + Args: + opt (str): The option to handle. + arg (str): The argument to pass to the handler function. + + Returns: + None + """ option_handlers = { ("-h", "--help"): self.show_help, ("-u", "--url"): self.use_url, From ba6f941f5dea1456ad1034028cf113c433c8ad55 Mon Sep 17 00:00:00 2001 From: cockroacher <163405488+cockroacher@users.noreply.github.com> Date: Tue, 26 Mar 2024 19:54:43 +0100 Subject: [PATCH 6/6] pylint --- default.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/default.py b/default.py index e918f1c5..a3335ac3 100644 --- a/default.py +++ b/default.py @@ -27,7 +27,7 @@ from engines.gov import write_tests as gov_write_tests from engines.sql import write_tests as sql_write_tests from tests.utils import clean_cache_files -import utils +from utils import TEST_FUNCS, TEST_ALL, test_sites def validate_test_type(tmp_test_types): @@ -51,7 +51,7 @@ def validate_test_type(tmp_test_types): """ test_types = [] - valid_tests = utils.TEST_FUNCS.keys() + valid_tests = TEST_FUNCS.keys() for test_type in tmp_test_types: if test_type in valid_tests: test_types.append(test_type) @@ -142,7 +142,7 @@ def show_test_help(global_translation): class CommandLineOptions: # pylint: disable=too-many-instance-attributes,missing-class-docstring - test_types = list(utils.TEST_ALL) + test_types = list(TEST_ALL) sites = [] output_filename = '' input_filename = '' @@ -497,7 +497,7 @@ def main(argv): options.input_take) elif len(options.sites) > 0: # run test(s) for every website - test_results = utils.test_sites(options.language, + test_results = test_sites(options.language, options.lang_code, options.sites, test_types=options.test_types,