Source code for coalib.results.result_actions.OpenEditorAction

import subprocess
from os.path import exists
from os import environ

from coalib.results.Diff import Diff
from coalib.results.Result import Result
from coalib.results.result_actions.ResultAction import ResultAction

EDITOR_ARGS = {
    'subl': '--wait',
    'gedit': '-s',
    'atom': '--wait'
}


GUI_EDITORS = ['kate', 'gedit', 'subl', 'atom']


[docs]class OpenEditorAction(ResultAction): SUCCESS_MESSAGE = 'Changes saved successfully.' @staticmethod
[docs] def is_applicable(result, original_file_dict, file_diff_dict): """ For being applicable, the result has to point to a number of files that have to exist i.e. have not been previously deleted. """ if not isinstance(result, Result) or not len(result.affected_code) > 0: return False filenames = set(src.renamed_file(file_diff_dict) for src in result.affected_code) return all(exists(filename) for filename in filenames)
[docs] def apply(self, result, original_file_dict, file_diff_dict, editor: str): """ Open file(s) :param editor: The editor to open the file with. """ # Use set to remove duplicates filenames = {src.file: src.renamed_file(file_diff_dict) for src in result.affected_code} editor_args = [editor] + list(filenames.values()) arg = EDITOR_ARGS.get(editor.strip(), None) if arg: editor_args.append(arg) # Dear user, you wanted an editor, so you get it. But do you really # think you can do better than we? if editor in GUI_EDITORS: subprocess.call(editor_args, stdout=subprocess.PIPE) else: subprocess.call(editor_args) for original_name, filename in filenames.items(): with open(filename, encoding='utf-8') as file: file_diff_dict[original_name] = Diff.from_string_arrays( original_file_dict[original_name], file.readlines(), rename=False if original_name == filename else filename) return file_diff_dict
if 'EDITOR' in environ: apply.__defaults__ = (environ['EDITOR'],)