class TaskRunner: def __init__(self, settingsProvider, fileContentProvider, buildConfigProvider, linePreprocessor, defaults): assert settingsProvider is not None assert fileContentProvider is not None assert buildConfigProvider is not None assert linePreprocessor is not None assert defaults is not None self.settingsProvider = settingsProvider self.fileContentProvider = fileContentProvider self.configsProvider = buildConfigProvider self.linePreprocessor = linePreprocessor self.defaults = defaults macroProcessor = MacroProcessor() self.valueProvider = ValueProvider() macroResolver = MacroResolver(macroProcessor, self.valueProvider) includeProcessor = IncludeProcessor() textInclude = TextInclude(includeProcessor, self.fileContentProvider) # последовательность важна! # Сначала резолвим макросы, потом делаем включение файлов # Это позволяет использовать макросы в include выражениях self.textPreprocessor = TextConveyorPreprocessor() self.textPreprocessor.addProcessor(macroResolver) self.textPreprocessor.addProcessor(textInclude) def run(self): rawSettings = self.settingsProvider.fetchSettings() buildReadyConfigs = self.configsProvider.getConfigs(rawSettings) for bc in buildReadyConfigs: self.valueProvider.setConfig(bc) self.runConfig(bc) def runConfig(self, config): content = self.getStepsContent(config) stepsRunner = StepsRunner(config, self.linePreprocessor, self.valueProvider) stepsRunner.run(content) def getStepsContent(self, config): pathToSteps = config.get('steps', self.defaults['steps']) content = self.fileContentProvider.fetchContent(pathToSteps) content = self.textPreprocessor.processText(content, self.textPreprocessor) return content
'builder_path': scriptDir, 'steps': os.path.join(scriptDir, 'steps.txt') } parser = argparse.ArgumentParser() parser.add_argument('--settings', required=False) allArgs = parser.parse_known_args() knownArgs = allArgs[0] overrideArgs = allArgs[1] # компоную препроцессор для индивидуальной обработки строк (удаление комментариев и ведущих пробельных символов) lineStripper = Stripper() commentRemover = CommentRemover() linePreprocessor = TextConveyorPreprocessor() linePreprocessor.addProcessor(commentRemover) linePreprocessor.addProcessor(lineStripper) # TODO: перенести в корень комапановки settingsPath = knownArgs.settings or defaults['settings'] fromFileSettingsProvider = FromFileSettingsProvider(settingsPath, linePreprocessor) overrideWithCmdSetProvider = CmdArgsOverriderSettingsProvider(fromFileSettingsProvider, overrideArgs, linePreprocessor) fContentProvider = FileContentProvider() buildConfigProvider = BuildConfigProvider() predefineBuildConfigProvider = PredefinedMacrosBuildConfigProvider(buildConfigProvider) predefineBuildConfigProvider.addPredefineMacro('builder_path', defaults['builder_path']) resolvedBuildConfigProvider = ResolvedBuildConfigProvider(predefineBuildConfigProvider)