Potlačení pravidel a baseline

Jak vypnout pravidlo na jednom řádku, v bloku nebo v celém souboru, proč potlačení zastaví i opravu, a jak nasadit DressCode na velký projekt bez obřího commitu díky baseline.

Čtyři úrovně

Výjimky z pravidel osobně nemám rád a do kódu je nepíšu; když už, tak v konfiguraci pro celou cestu. Jsou ale místa, kde pravidlo prostě nemá pravdu, a tam se hodí přesný nástroj a ne kladivo. Potlačení (anglicky suppression) má čtyři úrovně, od nejužší po nejširší:

úroveň jak kde
jeden řádek nebo příkaz // dresscode:ignore v kódu
blok dresscode:disable a dresscode:enable v kódu
celý soubor dresscode:ignore-file v kódu
cesta excludeRulePaths, excludePaths v konfiguraci

Vedle nich stojí baseline, která není výjimka z pravidla, ale z času: zapíše porušení, která v projektu jsou dnes, a hlásí jen ta nová.

Ať zvolíte kteroukoli, platí jedna věc: potlačené porušení se neopraví. Pravidlo smí kód změnit jen poté, co porušení ohlásilo a hlášení prošlo, a hlídá to jádro nástroje, ne autor pravidla. Potlačení tedy není jen ticho ve výpisu, ale skutečné vypnutí.

Potlačení na řádku

Komentář dresscode:ignore na konci řádku potlačí porušení na tomto řádku. Bez jména potlačí všechna pravidla, se jménem jen to jedno; víc jmen se odděluje čárkou:

$isEmpty = $value == null; // dresscode:ignore dresscode/strict-comparison

Komentář na vlastním řádku platí pro příkaz, který začíná na řádku pod ním, i když se ten příkaz táhne přes několik řádků:

// dresscode:ignore dresscode/multi-line-array
$matrix = [[1, 0, 0],
	[0, 1, 0],
	[0, 0, 1]];

Funguje //, # i /* */. Jméno pravidla je to z výpisu; místo něj DressCode přijme i jméno pravidla PHP CS Fixeru nebo PHP_CodeSniffer, které jeho pravidlo pokrývá. Stejně tak rozumí komentářům phpcs:ignore, phpcs:disable, phpcs:enable, phpcs:ignoreFile a anotaci @phpcsSuppress, takže kdo přechází z jiného nástroje, nemusí do kódu vůbec sáhnout. Přepis na nová jména pak udělá dresscode migrate-suppressions.

Potlačení v bloku

// dresscode:disable dresscode/line-length
$data = ['alpha' => 1, 'beta' => 2, 'gamma' => 3, 'delta' => 4, 'epsilon' => 5, 'zeta' => 6, 'eta' => 7];
$more = ['theta' => 8, 'iota' => 9, 'kappa' => 10, 'lambda' => 11, 'mu' => 12, 'nu' => 13, 'xi' => 14];
// dresscode:enable

disable bez jména vypne všechna pravidla až po enable; bez enable platí do konce souboru.

Potlačení v celém souboru

<?php // dresscode:ignore-file

Tenhle komentář kdekoli v souboru vypne pro celý soubor všechna pravidla. Hodí se pro generovaný kód, který leží mezi ručně psaným. Když je takových souborů víc, je čistší vyloučit je cestou nebo podle obsahu, viz skipWhen v konfiguraci.

Vypnutí pro cestu

Výjimka, která platí pro celý adresář, patří do konfigurace, ne do stovky souborů:

excludeRulePaths:
	dresscode/strict-comparison: [legacy]
	dresscode/line-length: [tests/fixtures]

Zbytek pravidel takový soubor zkontroluje normálně. Celé cesty vynechá excludePaths; obojí popisuje stránka Konfigurace.

Baseline

Na projektu s tisíci porušeními by první fix znamenal jeden obří commit. Někdy je to přesně to, co chcete udělat a mít za sebou. Někdy ne: kód se právě reviduje na jiné větvi, tým na to nemá týden, nebo chcete nové pravidlo zapnout jen pro nově psaný kód. Pro tyhle případy je baseline, tedy soupis porušení, která se dnes nemají hlásit.

dresscode check --generate-baseline
Baseline with 1408 violations written to dresscode-baseline.neon.
Name it in the configuration to make it apply.

Soubor vznikne vedle konfigurace a ve stejném formátu (.neon vedle dresscode.neon, .php vedle dresscode.php). Platit začne ve chvíli, kdy ho konfigurace pojmenuje:

baseline: dresscode-baseline.neon

Uvnitř je pro každý soubor seznam porušení s pravidlem, zprávou a otiskem:

files:
	src/Cart.php:
		-
			rule: dresscode/strict-comparison
			message: 'The == comparison must be written ''==='''
			fingerprint: a91a46b053d6d827

Otisk se počítá z pravidla, zprávy a obsahu řádku, ne z jeho čísla, takže baseline přežije úpravy jinde v souboru. Porušení, která jsou v baseline, se nehlásí ani neopravují, a shrnutí běhu je přizná, aby nikdo nežil v domnění, že je uklizeno:

OK  1408 violations in the baseline in 214 files

Když nějaké porušení z baseline zmizí, protože ho někdo opravil, běh upozorní, že položka už ničemu neodpovídá; stačí baseline vygenerovat znovu. Baseline se má zmenšovat, a jakmile je prázdná, smažte řádek z konfigurace a soubor s ním.

verze: 1.0