3 个版本 (破坏性更新)

0.7.0 2024年4月4日
0.6.0 2024年4月1日
0.5.0 2024年3月27日

#144 in 开发工具

GPL-3.0-or-later

92KB
2K SLoC

omnilinter

CI codecov GitHub commits (since latest release)

定义路径模式正则表达式规则,并一次性匹配所有你的仓库/项目/代码库。使用它来推广和保持良好的实践,跟踪弃用,并修复代码中的常见问题。

示例

% cat omnilinter.conf
[convert deprecated auto_ptr to unique_ptr]
files *.cpp
match /auto_ptr/

[convert setup.py to pyproject.toml]
files setup.py
nofiles pyproject.toml

[add license information]
files *.py *.c* *.h* *.rs
nomatch /^..? SPDX-FileCopyrightText:/

[add CI workflow]
files *.py *.c* *.h* *.rs
nofiles .github/workflows/*.yml

[add project README]
nofiles /README*
% omnilinter -c omnilinter.conf my_projects/*
my_projects/my_python_project
  setup.py: convert setup.py to pyproject.toml
  src/__init__.py: add license information
my_project/my_cpp_lib
  add project README
  add CI workflow
  src/main.cpp: add license information
  src/main.cpp:17: convert deprecated auto_ptr to unique_ptr

查看 omnilinter 自身的 配置作者规则集 以获取更多示例。

运行

至少,您需要指定配置文件路径和要检查的目录路径

omnilinter -c <path to omnilinter.conf> <directory to check> ...

或者,如果您在配置中直接设置了要检查的目录,并将其放置在默认位置(~/.config/omnilinter/omnilinter.conf),则可以仅运行

omnilinter

有用选项

  • --tags--skip-tags - 限制操作为规则子集。
  • --format by-root|full-paths|by-rule|by-path - 指定输出格式。
  • --color--palette - 调整输出颜色。
  • --error-exitcode - 如果任何规则匹配,则退出指定的代码,对于 CI 和脚本非常有用。

有关所有选项,请参阅 omnilinter --help

配置文件格式

示例 omnilinter.conf

root /path/to/project1
root /path/to/other_projects/*  # patterns are allowed

include /path/to/other.conf

[rule title]
tags tag1,tag2                  # used with --tags, --exclude-tags
nofiles /README* !/README.txt   # require absence of file
files *.py !*.pyi               # or require presence of a file, in which...
match /Object/ !/^class /       # ...require pattern match...
nomatch "^/usr/share/.*"        # ...or absence of pattern match

[next rule]
...

文件开头允许配置指令

  • root 指定默认操作目录。这些目录仅在命令行上未指定根目录时使用。此处支持 Shell 模式。非绝对路径相对于配置位置解析。

  • include 解析额外的配置。此处也支持 Shell 模式,非绝对路径相对于配置位置解析。

接下来是规则集,其中每个规则由以下部分组成

  • 括号标题,用于报告匹配项。如果您想在标题中包含闭合括号,请使用 ]]。所有其他部分都是可选的。

  • tags 指令,使用逗号或空格分隔的标签列表,以过滤使用 --tags--exclude-tags 命令行选项的规则。

  • 路径条件

    • 需要目录中存在特定路径模式的 files
    • 需要不存在这些模式的 nofiles

    每个条件都需要一个或多个 shell 模式(例如,*.py/src/*.c***/tests/*.rs)并允许排除(前缀为 !)。允许使用反斜杠转义和引号,就像在 shell 中一样(例如,"program output "\[[0-9]\].txt 匹配 program output [1].txt)。没有路径分隔符的样式匹配任何地方(*.py 匹配 setup.pysrc/mymodule/__init__.py),而带有路径分隔符的模式仅在相对于根目录的路径中匹配。

  • 内容条件(仅在 files 后允许,并且仅适用于该特定 files 条件匹配的文件)

    • match 需要在文件中匹配给定的正则表达式模式。
    • nomatch 需要不存在这样的匹配。

    这些条件需要一个或多个正则表达式,用括号(几乎)任何字符括起来(例如,/.*/".*"|.*| 都可以工作,因此可以避免转义)并允许使用 ! 前缀的排除。

    • size 使用运算符(>>=<, =or==, !=or<>) 对给定的字节数 (例如,) 大于等于 1024。
    • lines 以相同的方式检查行数。

您可以使用这些条件构建相当复杂的树,例如

[too big readme for such small rust library]
# match when there's src/lib.rs...
files src/lib.rs
# ...but no other .rs files under src/, which along with the
# previous condition suggest it's a single-file rust library
nofiles src/**/*.rs !src/lib.rs
# if there's README file of any kind,...
files /README*
# ...and it's longer than 25 lines...
lines >= 25
# ...unless there's Example: header (implied that it may contain a lot of code)
nomatch /^#* Example:/

当所有规则条件都满足时,报告规则匹配

README.md: too big readme for such small rust library

匹配可能包含上下文

  • 如果规则中的最后一个条件是 match,则将报告文件和行。
  • 否则,如果最后一个 路径 条件是 files,则将报告文件(如上面的示例所示)。
  • 否则,没有特定的上下文,报告是对检查的目录的总体报告。

因此,规则顺序很重要,因此应首先指定预条件,然后指定指向具体问题地点的最后一个条件。

规则模板

具有特殊[!template]标题的规则不是作为常规规则处理,而是指定了要添加到所有后续规则中的项(标签和条件)。这有助于减少重复。您可以通过指定没有任何项的无内容[!template]规则来重置模板。

安装

Packaging status

从 cargo 或您的包仓库安装

cargo install omnilinter

作者

许可协议

依赖项

~6–19MB
~209K SLoC