Z Nette Coding Standardu

Nette Coding Standard 4 je od teď jen preset a extension nad DressCode: co udělá ncs migrate a proč první fix přeformátuje víc souborů, než čekáte.

Co se změnilo

Nette Coding Standard byl do verze 3 tenká obálka nad PHP CS Fixerem a PHP_CodeSniffer s balíkem pravidel od Slevomatu: dva nástroje, dvě konfigurace (ncs.php pro fixer, ncs.xml pro sniffer) a příkaz ecs, který to spouštěl. Verze 4 je přesně to, čím měla být vždycky: preset. Pár set řádků, které říkají, jaká pravidla s jakými volbami dávají styl Nette, a extension, která je do DressCode zapojí.

Příkaz ncs check a ncs fix funguje dál, takže projekt, který ho volal z CI nebo z editoru, nemusí měnit nic. Pod ním běží DressCode.

Migrace konfigurace

Projekt bez vlastní konfigurace nepotřebuje nic: ncs bez souboru použije extension Nette Coding Standardu a výchozí preset nette/php. Projekt s ncs.php nebo ncs.xml je převede jedním příkazem:

vendor/bin/ncs migrate

Výsledkem je dresscode.php s extension a s tím, co v původních souborech bylo navíc: přepsaná pravidla z ncs.php jako enable() a disable(), vyloučené cesty z ncs.xml jako excludePaths(). Jména pravidel projdou překladem na jména DressCode; co žádné pravidlo nepokrývá, příkaz vypíše a vynechá. Volby přepsané z ncs.php se kopírují, jak jsou, s poznámkou, že jejich jména je potřeba zkontrolovat proti ncs rules, protože volba fixeru a volba pravidla DressCode se mohou jmenovat jinak.

return Config::create()
	->extension(Nette\CodingStandard\Extension::class)
	->enable('dresscode/line-length', ['limit' => 100])
	->excludePaths(['tests/fixtures']);

Od té chvíle je konfigurace jedna a dresscode i ncs čtou tutéž. Extension zaregistruje presety nette/php (výchozí), nette/clean-code, nette/optimize-fn a nette/types, vyloučí cesty, které vylučovala verze 3 (expected, tmp, fixtures*), a zachová filtr souborů podle verze PHP, na který Nette spoléhá v testech.

První fix přeformátuje víc, než čekáte

Verze 4 není řádek po řádku totéž co verze 3, a schválně. Některé rozdíly jsou opravy toho, co verze 3 nechávala být: velké písmeno na začátku komentáře // Komentář, komentář /* enum */ před case, declare(strict_types=1) na řádku otevíracího tagu, nezlomitelná mezera zapsaná doslova v řetězci. Napříč balíčky Nette to byla víc než stovka souborů z necelých tří tisíc.

Udělejte to jako samostatný commit: ncs fix, commit bez jiných změn, hotovo. Projít to řádek po řádku nemá cenu; cenu má vědět, že v tom commitu není nic jiného.

Co zůstalo

  • Komentáře phpcs:ignore a spol. fungují dál; přepis na dresscode:ignore udělá dresscode migrate-suppressions.
  • Presety nette/clean-code, nette/optimize-fn a nette/types se zapínají v presets, ne přes $presets/ v XML.
  • Vlastní sniffy a fixery, pokud nějaké byly, se přepisují podle návodu; přepsaný sniff je obvykle několikanásobně kratší.
verze: 1.0