add review classifier rules for this repo
Eight classifications in .hyperhive/review-classifier.yml: no AI advertising in commit messages, no committed secrets, no clippy allow attributes, no debug leftovers, no dead code, tests with behaviour changes, docs with operator-facing changes, one purpose per PR. A swarm-controller test parses the real file so it can't rot, and the rust source fileset in nix/rust.nix includes it so the test finds it in the build sandbox.
This commit is contained in:
parent
05c9075825
commit
3b1de422c6
3 changed files with 83 additions and 1 deletions
52
.hyperhive/review-classifier.yml
Normal file
52
.hyperhive/review-classifier.yml
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
classifications:
|
||||||
|
- name: no-ads
|
||||||
|
description: >-
|
||||||
|
A commit message contains a co-authored-by line or other advertising
|
||||||
|
for an AI model, such as a "generated with" footer.
|
||||||
|
polarity: negative
|
||||||
|
threshold: 80
|
||||||
|
- name: no-secrets
|
||||||
|
description: >-
|
||||||
|
The diff adds a secret as literal text: a password, API key, access
|
||||||
|
token or private key. A path or name that points at a secret is not
|
||||||
|
one.
|
||||||
|
polarity: negative
|
||||||
|
threshold: 60
|
||||||
|
- name: no-lint-suppression
|
||||||
|
description: >-
|
||||||
|
The diff adds a Rust `#[allow(clippy::...)]` or `#![allow(clippy::...)]`
|
||||||
|
attribute instead of fixing what the lint reports.
|
||||||
|
polarity: negative
|
||||||
|
threshold: 70
|
||||||
|
- name: no-debug-leftovers
|
||||||
|
description: >-
|
||||||
|
The diff adds leftover debugging: a `dbg!` call, a print statement
|
||||||
|
that only inspects a value, or a block of commented-out code.
|
||||||
|
polarity: negative
|
||||||
|
threshold: 70
|
||||||
|
- name: no-dead-code
|
||||||
|
description: >-
|
||||||
|
The diff adds a function, type, option or module that nothing in the
|
||||||
|
diff calls, uses or registers, and that is not a test, a trait
|
||||||
|
implementation or public API.
|
||||||
|
polarity: negative
|
||||||
|
threshold: 75
|
||||||
|
- name: tests-with-behaviour
|
||||||
|
description: >-
|
||||||
|
Every change to how the code behaves comes with a new or updated test
|
||||||
|
that exercises it.
|
||||||
|
polarity: positive
|
||||||
|
threshold: 65
|
||||||
|
- name: docs-updated
|
||||||
|
description: >-
|
||||||
|
A change to what an operator or user sees, such as a command, flag,
|
||||||
|
option, endpoint, service or default, updates the matching page under
|
||||||
|
docs/ or the crate's README in the same diff.
|
||||||
|
polarity: positive
|
||||||
|
threshold: 65
|
||||||
|
- name: one-purpose
|
||||||
|
description: >-
|
||||||
|
Every change in the diff serves what the commit messages say the PR
|
||||||
|
does, and nothing unrelated is bundled in.
|
||||||
|
polarity: positive
|
||||||
|
threshold: 65
|
||||||
|
|
@ -35,9 +35,15 @@ rec {
|
||||||
# `hyperhive-assets` derivation and are loaded by the binaries at
|
# `hyperhive-assets` derivation and are loaded by the binaries at
|
||||||
# runtime from `$HIVE_ASSETS_DIR`. Net effect: only `*.rs` /
|
# runtime from `$HIVE_ASSETS_DIR`. Net effect: only `*.rs` /
|
||||||
# `*.toml` / `Cargo.lock` edits rebuild the rust derivations.
|
# `*.toml` / `Cargo.lock` edits rebuild the rust derivations.
|
||||||
|
#
|
||||||
|
# The one other file in it is the repo's own review-classifier rules: a
|
||||||
|
# `swarm-controller` test parses them, so they must be in the sandbox.
|
||||||
cleanSrc = lib.fileset.toSource {
|
cleanSrc = lib.fileset.toSource {
|
||||||
root = ../.;
|
root = ../.;
|
||||||
fileset = craneLib.fileset.commonCargoSources ../.;
|
fileset = lib.fileset.unions [
|
||||||
|
(craneLib.fileset.commonCargoSources ../.)
|
||||||
|
../.hyperhive/review-classifier.yml
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
# The workspace's dependency tree, built once and cached as its own
|
# The workspace's dependency tree, built once and cached as its own
|
||||||
|
|
|
||||||
|
|
@ -1087,6 +1087,30 @@ classifications:
|
||||||
assert_eq!(parse_rules(json_path, json.as_bytes()), Ok(want));
|
assert_eq!(parse_rules(json_path, json.as_bytes()), Ok(want));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn this_repos_own_rules_file_loads() {
|
||||||
|
let [yml_path, _] = RULES_PATHS;
|
||||||
|
let rules = parse_rules(
|
||||||
|
yml_path,
|
||||||
|
include_str!("../../.hyperhive/review-classifier.yml").as_bytes(),
|
||||||
|
)
|
||||||
|
.expect("the repo's rules file parses");
|
||||||
|
let names: Vec<_> = rules.iter().map(|c| c.name.as_str()).collect();
|
||||||
|
assert_eq!(
|
||||||
|
names,
|
||||||
|
[
|
||||||
|
"no-ads",
|
||||||
|
"no-secrets",
|
||||||
|
"no-lint-suppression",
|
||||||
|
"no-debug-leftovers",
|
||||||
|
"no-dead-code",
|
||||||
|
"tests-with-behaviour",
|
||||||
|
"docs-updated",
|
||||||
|
"one-purpose",
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn a_bad_rules_file_is_an_error_in_either_format() {
|
fn a_bad_rules_file_is_an_error_in_either_format() {
|
||||||
let mut unknown_rule_field = datetime();
|
let mut unknown_rule_field = datetime();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue