写作有具体的动作¶
本教程旨在向您展示如何编写特定于某些熊的动作。它假设您知道如何使用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
成功应用操作后将打印的消息。
每个操作类都应该有这两个方法:
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
签名中的参数。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命令,该命令将打开一个编辑器来编辑提交消息。