| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 | # SPDX-License-Identifier: AGPL-3.0-or-later# lint: pylint# pylint: disable=missing-module-docstringimport sysimport ioimport osimport argparseimport loggingimport searx.searchimport searx.search.checkerfrom searx.search import PROCESSORSfrom searx.engines import engine_shortcuts# configure loggingroot = logging.getLogger()handler = logging.StreamHandler(sys.stdout)for h in root.handlers:    root.removeHandler(h)root.addHandler(handler)# color only for a valid terminalif sys.stdout.isatty() and os.environ.get('TERM') not in ['dumb', 'unknown']:    RESET_SEQ = "\033[0m"    COLOR_SEQ = "\033[1;%dm"    BOLD_SEQ = "\033[1m"    BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = map(lambda i: COLOR_SEQ % (30 + i), range(8))else:    RESET_SEQ = ""    COLOR_SEQ = ""    BOLD_SEQ = ""    BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = "", "", "", "", "", "", "", ""# equivalent of 'python -u' (unbuffered stdout, stderr)stdout = io.TextIOWrapper(    # pylint: disable=consider-using-with    open(sys.stdout.fileno(), 'wb', 0),    write_through=True)stderr = io.TextIOWrapper(    # pylint: disable=consider-using-with    open(sys.stderr.fileno(), 'wb', 0)    , write_through=True)# iterator of processorsdef iter_processor(engine_name_list):    if len(engine_name_list) > 0:        for name in engine_name_list:            name = engine_shortcuts.get(name, name)            processor = PROCESSORS.get(name)            if processor is not None:                yield name, processor            else:                stdout.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}{RED}Engine does not exist{RESET_SEQ}')    else:        for name, processor in searx.search.PROCESSORS.items():            yield name, processor# actual check & displaydef run(engine_name_list, verbose):    searx.search.initialize()    for name, processor in iter_processor(engine_name_list):        stdout.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}Checking\n')        if not sys.stdout.isatty():            stderr.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}Checking\n')        checker = searx.search.checker.Checker(processor)        checker.run()        if checker.test_results.succesfull:            stdout.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}{GREEN}OK{RESET_SEQ}\n')            if verbose:                stdout.write(f'    {"found languages":15}: {" ".join(sorted(list(checker.test_results.languages)))}\n')        else:            stdout.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}{RESET_SEQ}{RED}Error{RESET_SEQ}')            if not verbose:                errors = [test_name + ': ' + error for test_name, error in checker.test_results]                stdout.write(f'{RED}Error {str(errors)}{RESET_SEQ}\n')            else:                stdout.write('\n')                stdout.write(f'    {"found languages":15}: {" ".join(sorted(list(checker.test_results.languages)))}\n')                for test_name, logs in checker.test_results.logs.items():                    for log in logs:                        log = map(lambda l: l if isinstance(l, str) else repr(l), log)                        stdout.write(f'    {test_name:15}: {RED}{" ".join(log)}{RESET_SEQ}\n')# call by setup.pydef main():    parser = argparse.ArgumentParser(description='Check searx engines.')    parser.add_argument('engine_name_list', metavar='engine name', type=str, nargs='*',                        help='engines name or shortcut list. Empty for all engines.')    parser.add_argument('--verbose', '-v',                        action='store_true', dest='verbose',                        help='Display details about the test results',                        default=False)    args = parser.parse_args()    run(args.engine_name_list, args.verbose)if __name__ == '__main__':    main()
 |