def main(): log_printer = LogPrinter(ConsolePrinter()) console_printer = ConsolePrinter() exitcode = 0 try: did_nothing = True yielded_results = False (sections, local_bears, global_bears, targets) = gather_configuration(acquire_settings, log_printer) if bool(sections["default"].get("show_bears", "False")): show_bears(local_bears, global_bears, console_printer) did_nothing = False else: for section_name in sections: section = sections[section_name] if not section.is_enabled(targets): continue file_diff_dict = {} print_section_beginning(console_printer, section) results = execute_section( section=section, global_bear_list=global_bears[section_name], local_bear_list=local_bears[section_name], print_results=print_results, log_printer=log_printer, file_diff_dict=file_diff_dict) yielded_results = yielded_results or results[0] finalize(file_diff_dict, results[3], log_printer) did_nothing = False if did_nothing: nothing_done(console_printer) if yielded_results: exitcode = 1 except BaseException as exception: # pylint: disable=broad-except exitcode = exitcode or get_exitcode(exception, log_printer) return exitcode
def test_finalize_backup_fail(self): def raise_error(file, mode=""): raise PermissionException _open = builtins.open _copy2 = shutil.copy2 try: builtins.open = raise_error builtins.__dict__["open"] = raise_error shutil.copy2 = lambda src, dst: self.assertEqual(src+".orig", dst) diff = Diff() diff.delete_line(2) # Should catch the backup permission error during write-back. finalize({"f": diff}, {"f": ["1", "2", "3"]}) # Test logging output. finalize({"f": diff}, {"f": ["1", "2"]}, log_printer=None) logger = LogPrinter(StringPrinter()) finalize({"f": diff}, {"f": ["1"]}, log_printer=logger) self.assertIn("Can't backup, writing patch to file f failed.", logger.printer.string) finally: builtins.open = _open shutil.copy2 = _copy2
def test_print_result(self): print_result(self.console_printer, self.log_printer, None, self.file_diff_dict, "illegal value", {}) with simulate_console_inputs(0): print_result(self.console_printer, self.log_printer, None, self.file_diff_dict, PatchResult("origin", "msg", {}), {}) (testfile, testfile_path) = tempfile.mkstemp() os.close(testfile) file_dict = { testfile_path: ["1\n", "2\n", "3\n"], "f_b": ["1", "2", "3"] } diff = Diff() diff.delete_line(2) diff.change_line(3, "3\n", "3_changed\n") with simulate_console_inputs(1), self.assertRaises(ValueError): ApplyPatchAction.is_applicable = staticmethod(lambda result: True) print_result(self.console_printer, self.log_printer, None, self.file_diff_dict, PatchResult("origin", "msg", {testfile_path: diff}), file_dict) # To assure user can rechose if he didn't chose wisely with simulate_console_inputs("INVALID", -1, 1, 3) as input_generator: curr_section = Section("") print_section_beginning(self.console_printer, curr_section) print_result(self.console_printer, self.log_printer, curr_section, self.file_diff_dict, PatchResult("origin", "msg", {testfile_path: diff}), file_dict) self.assertEqual(input_generator.last_input, 2) finalize(self.file_diff_dict, file_dict) # Check that the next section does not use the same file_diff_dict self.assertEqual(len(self.file_diff_dict), 0) with open(testfile_path) as f: self.assertEqual(f.readlines(), ["1\n", "3_changed\n"]) os.remove(testfile_path) os.remove(testfile_path + ".orig") name, section = get_action_info(curr_section, TestAction().get_metadata()) self.assertEqual(input_generator.last_input, 3) self.assertEqual(str(section), " {param : 3}") self.assertEqual(name, "TestAction") # Check if the user is asked for the parameter only the first time. # Use OpenEditorAction that needs this parameter (editor command). with simulate_console_inputs(1, "test_editor", 0, 1, 0) as generator: OpenEditorAction.is_applicable = staticmethod(lambda result: True) patch_result = PatchResult("origin", "msg", {testfile_path: diff}) patch_result.file = "f_b" print_result(self.console_printer, self.log_printer, curr_section, self.file_diff_dict, patch_result, file_dict) # choose action, choose editor, choose no action (-1 -> 2) self.assertEqual(generator.last_input, 2) # It shoudn't ask for parameter again print_result(self.console_printer, self.log_printer, curr_section, self.file_diff_dict, patch_result, file_dict) self.assertEqual(generator.last_input, 4)