# core/producers/tool.yamllint.producer.ts

> 41 lines of code and 10 definitions.

Tree: GovLab Quality
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-producers-tool-yamllint-producer-ts
Source text: https://banes-lab.com/source/quality/core/producers/tool.yamllint.producer.ts.txt

Listed in [core/producers](https://banes-lab.com/api/source/quality/core/producers.md), after [core/producers/tool.staticcheck.producer.ts](https://banes-lab.com/source/quality/core/producers/tool.staticcheck.producer.ts.md).

## Definitions

- `TOOL` (lexical_declaration, line 7)
- `PYTHON` (lexical_declaration, line 8)
- `DOCS` (lexical_declaration, line 9)
- `DUMP` (lexical_declaration, line 10)
- `produce` (lexical_declaration, line 16)
- `version` (lexical_declaration, line 17)
- `parsed` (lexical_declaration, line 18)
- `rules` (lexical_declaration, line 19)
- `id` (lexical_declaration, line 22)
- `description` (lexical_declaration, line 23)

## Contained in

- [core/producers](https://banes-lab.com/anatomy/quality/folder-quality-core-producers.md)

## Source

```typescript
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";

const TOOL = "yamllint";
const PYTHON = "python";
const DOCS = "https://yamllint.readthedocs.io/en/stable/rules.html";
const DUMP =
    "import os,importlib,json,yamllint.rules as R;d=os.path.dirname(R.__file__);" +
    "mods=[f[:-3] for f in os.listdir(d) if f.endswith('.py') and not f.startswith('__') and f!='common.py'];" +
    "print(json.dumps([{'id':getattr(importlib.import_module('yamllint.rules.'+n),'ID',n)," +
    "'d':((getattr(importlib.import_module('yamllint.rules.'+n),'__doc__','') or '').strip().split(chr(10)) or [''])[0]} for n in mods]))";

const produce = async function produce(): Promise<CatalogProduct[]> {
    const version = commandVersion(PYTHON, ["-m", TOOL, "--version"]);
    const parsed: unknown = JSON.parse(commandOutput(PYTHON, ["-c", DUMP]));
    const rules = (Array.isArray(parsed) ? parsed : [])
        .filter(isRecord)
        .flatMap((entry): CatalogRule[] => {
            const id = stringField(entry, "id");
            const description = stringField(entry, "d");
            return id === ""
                ? []
                : [
                      {
                          canonical: null,
                          category: "yaml",
                          description: description === "" ? null : description,
                          ecosystem: "yaml",
                          name: id,
                          ruleId: id,
                          tool: TOOL,
                          toolVersion: version,
                          url: DOCS,
                      },
                  ];
        })
        .toSorted(byRuleId);
    return [{ rules, source: TOOL, summary: { tool: TOOL, toolVersion: version, total: rules.length } }];
};

defineProducer({ name: TOOL, produce, refresh: "manual" });
```
