基于正则表达式的Linter
rebl的Python项目详细描述
欢迎使用rebl
-一个基于正则表达式的Linter
为了提高代码质量,linter是非常有用的工具。然而,它们的行为通常是固定的或难以扩展。在
虽然可以使用grep
来扫描一个文件中的模式,但是当扫描一个文件中的许多模式时,这要么很慢(因为每个模式扫描一次文件),要么无法维护(因为模式变得非常非常长)。在
rebl
是一个小的短绒,它试图平衡grep
的简单性和常规短绒的有用性。在
正则表达式不适合处理语言语法吗?在
当然。这个linter是在充分理解基于行的正则表达式有这样的局限性的基础上开发的。这个linter坚定地打算用20%的工作量提供80%的可用性。在
你需要知道的东西
这个linter的模式配置文件是一个python模块。你为什么要在意?有两个原因-
- 文件保存在它自己的目录中,并且
- 该目录还应该包含一个空的
__init__.py
文件。在
默认的模式配置文件保存在(path of rebl)/.reblrc/config.py
中,但将搜索其他路径(见下文)。在
有两种方法可以重写默认路径;一种是在命令行中指定--config=/absolute/path/to/config.py
。另一种方法是有一个名为.reblrc
的文件,其中包含--config=relative/path/to/config.py
。请注意,如果在当前工作目录中找不到文件.reblrc
,则rebl
将在父目录中查找。如果在任何地方找不到.reblrc
文件,则继续检查进一步的路径。relative/path/to/config.py
与找到.reblrc
文件的目录有关。在
如果没有指定模式配置,rebl
将查找模式配置
- 在当前工作目录中,然后检查父目录(项目-或多项目配置-可能会命中用户的主目录)
- 在rebl程序目录中(用户范围配置)
- 在
/etc/rebl/config.py
(即系统范围的配置)
模式配置示例
为了方便起见,在这个存储库的.reblrc目录中提供了一个示例模式配置。提供了一个符号链接_reblrc
,使其可见。在
配置示例:
patterns = {}
patterns['.py'] = {
"HW0025": (
"No need for exc_info when using log.exception",
["log.exception", "exc_info"],[],[] ),
}
在哪里
- 在
.py是应用模式的文件扩展名
在 - 在
HW0025是模式键,对于每个模式必须是唯一的第一个字符是置信度(HML表示高、中、低)第二个字符是错误级别(EWI表示错误、警告、信息)下一组数字是其余模式的唯一标识符
在 - 在
下一行给出的字符串是用户友好的linter消息,1行
在 - 在
下一行有3个列表,分别是“all of”、“any of”和“none of”列表。在
当一行标志
- 它匹配“all of”列表中的所有regex
- 它与“any of”列表中的任何regex匹配
- 它不匹配“none-of”列表中的所有regex。在
正则表达式是自动锚定的。在
这意味着模式
在hello
将匹配包含单词“hello”的任何行—它将自动重写为"^.*hello.*$"
,使rebl
的行为更像{}。在
高级检测
所有列表、任何列表和任何列表都不能组合。在
如果这还不够,如果这三个列表都是空的,rebl将查找一个名为detect_[ext]_[pattern key]
的函数,该函数接受文件名和行参数,例如
将为每一行调用
- 匹配时返回True;或
- 如果不匹配,则返回False。在
定影器
如果函数fix_[ext]_[pattern key]
存在,则可以使用它来
批量执行修复。
例如
def fix_py_MW0049(filename, line):
return line.replace("import csv", "import unicodecsv as csv")
如果rebl
与--fix
一起运行并且行与为模式键MW0049给定的模式匹配,则将自动调用。在
行钩子/上下文收集器
可以定义一个行钩子来收集每行的上下文,例如
def linehook_<ext>(filename, lines, linenum, context):
如果defined允许收集状态数据,比如当前函数名、在thusfar中发现的错误,那么将在每一行上调用它。在
由于linehook经常被调用,理想情况下应该保持轻巧;也就是说,尽量避免在这里出现太多的循环。在
状态应该保持在dict中context
-这个dict会重置每个文件。在
- 项目
标签: