写作有具体的动作

本教程旨在向您展示如何编写特定于某些熊的动作。它假设您知道如何使用Coala,并且熟悉熊。

什么是动作?

动作是用户与Coala交互并决定如何处理Coala完成的分析的一种方式。熊运行一些分析并通过结果与用户沟通,然后需要对这些结果采取一些行动。

Coala提供了一些内置的默认操作,如:

  • DoNothingAction :顾名思义,此操作不执行任何操作,当您想要忽略结果时,可以选择此操作。

  • ShowPatchAction :此操作显示熊建议的代码更改。

  • ApplyPatchAction :此操作自动应用Coala建议的更改。

  • IgnoreResultAction :此消息在Coala建议更改的部分添加忽略注释,以便您下次运行Coala时不会建议这些更改。

  • ShowAppliedPatchesAction :此操作显示Coala应用的所有更改。

Coala确定默认操作中的哪些操作适用于结果,并要求用户选择一个要应用的操作。

熊市的具体行动是什么?

在某些情况下,熊可能会建议一些与代码无关的更改,例如 GitCommitBear 可以发现在提交消息的快捷日志和正文之间没有换行符。在这种情况下,没有与结果相关联的补丁,并且任何默认操作都可能不适用。但是,可以编写一个操作,该操作可以在短日志和提交消息正文之间添加换行符,但此操作将仅特定于GitCommittee Bear。

您可能会遇到类似的情况,编写特定于某个熊的操作可能会对您有所帮助。

编写动作

要编写特定于BEAR的操作,我们需要创建一个实现逻辑的类。这最好在 coala-bears 定义BEAR的目录中的存储库。

from coalib.results.result_actions.ResultAction import ResultAction

class SomeAction(ResultAction):

    SUCCESS_MESSAGE = 'Something done successfully.'

ResultAction 用作所有操作的基类,并为所有操作提供统一接口。

SUCCESS_MESSAGE 成功应用操作后将打印的消息。

每个操作类都应该有这两个方法:

  1. is_applicable 方法:它有决定动作是否适用的逻辑。

    @staticmethod
    def is_applicable(result,
                      original_file_dict,
                      file_diff_dict,
                      applied_actions=()):
    

    它必须返回布尔值, True 如果动作适用于特定结果, False 否则。

    is_applicable 方法接受四个参数:

    • result :我们要检查操作是否适用的结果。

    • original_file_dict :关键字为文件名,值为生成结果时状态的文件的字典。

    • file_diff_dict :一个字典,其关键字是文件名,值是文件从Original_FILE_DICT中的状态到当前状态的差异。

    • applied_actions :已应用于当前结果的操作名称列表。

    备注

    is_applicable 不一定非得是静电的方法。在这种情况下,您还需要将 self 签名中的参数。

  2. apply 方法:它具有何时应用操作的逻辑。

    def apply(self,
              result,
              original_file_dict,
              file_diff_dict,
              **kwargs):
        """
        Apply (S)ome Action
        """
    

    Apply方法必须返回 file_diff_dict .

    为编写文档字符串 apply 方法是非常重要的。当被要求选择要应用的操作时,文档字符串的内容将显示给用户。用户可以使用括号中的字母作为选择此操作的方式。

除此之外,您还可以添加其他帮助器方法,甚至可以添加 init 方法添加到操作类。

将熊市行动传递给结果

写完熊市行动后,你必须让科拉知道这件事。当熊产生结果时,您可以使用可选参数传递该熊的列表操作实例 actions .

假设 SomeAction 是特定于 SomeBear

from path.to.SomeAction import SomeAction

class SomeBear:

    def run():

        yield Result('origin', 'message', actions=[SomeAction()])

编辑委员会消息操作示例

我们将看一个示例, EditCommitMessageAction 对于 GitCommitBear 。无论何时,只要GitCommittee Bear建议对提交消息进行一些更改,我们就可以向用户提供一个操作,该操作在应用时将打开一个编辑器,用户可以在其中编辑提交消息。

import subprocess
from coalib.results.result_actions.ResultAction import ResultAction

class EditCommitMessageAction(ResultAction):

    SUCCESS_MESSAGE = 'Commit message edited successfully.'

    def apply(self, result, original_file_dict, file_diff_dict):
        """
        Edit (C)ommit Message [Note: This may rewrite your commit history]
        """
        subprocess.check_call(['git', 'commit', '-o', '--amend'])
        return file_diff_dict

注意 is_applicable 方法未实现,这是因为 ResultAction 已经实现了这一点,并且它总是返回True,这就是我们在本例中想要的。

apply 方法会产生一个简单的进程,该进程运行一个git命令,该命令将打开一个编辑器来编辑提交消息。