core/producers/tool.bandit.producer.ts
core/producers/tool.bandit.producer.ts is a file in GovLab Quality. 47 lines of code and 11 definitions.
import type { CatalogProduct, CatalogRule } from "#types/catalog.types";
import { commandOutput, commandVersion } from "#core/adapters/invocation.adapter";
import { isRecord, stringField } from "#core/selectors/record.selector";
import { byRuleId } from "#core/comparators/rule.comparator";
import { defineProducer } from "#core/registries/producer.registry";
import { distinctRules } from "#core/selectors/catalog.selector";
const TOOL = "bandit";
const PYTHON = "python";
const DOCS = "https://bandit.readthedocs.io/en/latest/plugins/index.html";
const DUMP = [
"from bandit.core import extension_loader as el",
"import json",
"m = el.MANAGER",
"out = []",
"for pid, p in m.plugins_by_id.items():",
' out.append({"id": pid, "name": getattr(p, "name", pid)})',
"for bid, b in m.blacklist_by_id.items():",
' nm = b.get("name") if isinstance(b, dict) else None',
' out.append({"id": bid, "name": nm or bid})',
"print(json.dumps(out))",
].join("\n");
const produce = async function produce(): Promise<CatalogProduct[]> {
const version = commandVersion(PYTHON, ["-m", TOOL, "--version"]);
const parsed: unknown = JSON.parse(commandOutput(PYTHON, ["-c", DUMP]));
const rows = (Array.isArray(parsed) ? parsed : []).filter(isRecord).flatMap((entry): CatalogRule[] => {
const id = stringField(entry, "id");
const name = stringField(entry, "name") || id;
return id === ""
? []
: [
{
canonical: null,
category: "security",
description: null,
ecosystem: PYTHON,
name,
ruleId: id,
tool: TOOL,
toolVersion: version,
url: DOCS,
},
];
});
const rules = distinctRules(rows).toSorted(byRuleId);
return [{ rules, source: TOOL, summary: { tool: TOOL, toolVersion: version, total: rules.length } }];
};
defineProducer({ name: TOOL, produce, refresh: "manual" });