#! /usr/bin/python3 import os, logging, click from ffx.file_properties import FileProperties from ffx.ffx_controller import FfxController from ffx.database import databaseContext from ffx.test.helper import createMediaTestFile from ffx.test.scenario import Scenario @click.group() @click.pass_context @click.option('-v', '--verbose', type=int, default=0, help='Set verbosity of output') @click.option("--dry-run", is_flag=True, default=False) def ffx(ctx, verbose, dry_run): """FFX""" ctx.obj = {} ctx.obj['database'] = databaseContext(databasePath=None) ctx.obj['dry_run'] = dry_run ctx.obj['verbosity'] = verbose # Critical 50 # Error 40 # Warning 30 # Info 20 # Debug 10 fileLogVerbosity = max(40 - verbose * 10, 10) consoleLogVerbosity = max(20 - verbose * 10, 10) homeDir = os.path.expanduser("~") ffxLogDir = os.path.join(homeDir, '.local', 'var', 'log') if not os.path.exists(ffxLogDir): os.makedirs(ffxLogDir) ffxLogFilePath = os.path.join(ffxLogDir, 'ffx.tests.log') ctx.obj['logger'] = logging.getLogger('FFX Tests') ctx.obj['logger'].setLevel(logging.DEBUG) ctx.obj['report_logger'] = logging.getLogger('FFX Test Result') ctx.obj['report_logger'].setLevel(logging.INFO) ffxFileHandler = logging.FileHandler(ffxLogFilePath) ffxFileHandler.setLevel(fileLogVerbosity) ffxConsoleHandler = logging.StreamHandler() ffxConsoleHandler.setLevel(consoleLogVerbosity) if os.path.isfile('ffx_test_report.log'): os.unlink('ffx_test_report.log') ffxTestReportFileHandler = logging.FileHandler('ffx_test_report.log') fileFormatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') ffxFileHandler.setFormatter(fileFormatter) consoleFormatter = logging.Formatter( '%(message)s') ffxConsoleHandler.setFormatter(consoleFormatter) reportFormatter = logging.Formatter( '%(message)s') ffxTestReportFileHandler.setFormatter(reportFormatter) ctx.obj['logger'].addHandler(ffxConsoleHandler) ctx.obj['logger'].addHandler(ffxFileHandler) ctx.obj['report_logger'].addHandler(ffxConsoleHandler) ctx.obj['report_logger'].addHandler(ffxTestReportFileHandler) # Another subcommand @ffx.command() @click.pass_context def run(ctx): """Run ffx test sequences""" ctx.obj['logger'].info('Starting FFX test runs') for scenarioIdentifier in Scenario.list(): scenario = Scenario.getClassReference(scenarioIdentifier)(ctx.obj) ctx.obj['logger'].debug(f"Running scenario {scenarioIdentifier}") scenario.run() @ffx.command() @click.pass_context @click.argument('paths', nargs=-1) def dupe(ctx, paths): existingSourcePaths = [p for p in paths if os.path.isfile(p) and p.split('.')[-1] in FfxController.INPUT_FILE_EXTENSIONS] for sourcePath in existingSourcePaths: sourceFileProperties = FileProperties(ctx.obj, sourcePath) sourceMediaDescriptor = sourceFileProperties.getMediaDescriptor() createMediaTestFile(sourceMediaDescriptor, baseName='dupe') if __name__ == '__main__': ffx()