Nette Documentation Preview

syntax
Z Nette Coding Standardu
************************

.[perex]
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:

```shell
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.

```php
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` |migration#3. Přepište komentáře].
- 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 |porting-rules]; přepsaný sniff je obvykle několikanásobně kratší.

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ší.