friendsoftwig / twigcs
Checkstyle automation for Twig
Installs: 4 045 171
Dependents: 60
Suggesters: 4
Security: 0
Stars: 342
Watchers: 34
Forks: 34
Open Issues: 26
Requires
- php: ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0
- ext-ctype: *
- ext-hash: *
- ext-json: *
- ext-mbstring: *
- ext-simplexml: *
- symfony/console: ^4.4 || ^5.3 || ^6.0 || ^7.0
- symfony/filesystem: ^4.4 || ^5.3 || ^6.0 || ^7.0
- symfony/finder: ^4.4 || ^5.3 || ^6.0 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^9.6.15
- symfony/phpunit-bridge: ^7.0.1
- dev-master
- dev-main
- 6.4.0
- 6.3.0
- 6.2.0
- v6.1.0
- v6.0.0
- 5.2.0
- v5.1.0
- v5.0.0
- v4.1.0
- v4.0.0
- v4.0-BETA4
- v4.0-BETA3
- v4.0.BETA2
- v4.0-BETA
- 3.2.x-dev
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.1
- v3.0.0
- v2.1.0
- v2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.x-dev
- 1.0.0
- dev-dependabot/composer/phpunit/phpunit-tw-11.3.6
- dev-dependabot/composer/phpunit/phpunit-tw-11.3.5
- dev-dependabot/composer/symfony/phpunit-bridge-tw-7.1.4
- dev-revert-codecov
- dev-phar
This package is auto-updated.
Last update: 2024-09-19 20:50:28 UTC
README
The missing checkstyle for twig!
Twigcs aims to be what phpcs is to php. It checks your codebase for violations on coding standards.
How to install
Run
composer require --dev friendsoftwig/twigcs
to install friendsoftwig/twigcs
with composer
.
Run
phive install friendsoftwig/twigcs
to install friendsoftwig/twigcs
with phive
.
How to run
Basically, just run:
twigcs /path/to/views
On Symfony projects, you can run, for instance:
twigcs /project/dir/app/Resources/views
You will get a summary of the violations in the console. The exit code of the command is based on the severity of any violation found. By default, twigcs only tolerates info, this can be changed at run time:
twigcs /path/to/views --severity error # Allows info and warnings twigcs /path/to/views --severity warning # Allows info twigcs /path/to/views --severity info # Disallows info twigcs /path/to/views --severity ignore # Allows everything
With the example above, info is still displayed but not altering the exit code.
You can also exclude relative subfolders of path like this:
twigcs /path/to/views --exclude vendor
Tips: You can use multiple exclude parameters.
Restricting output
By default TwigCS will output all lines that have violations regardless of whether they match the severity level
specified or not. If you only want to see violations that are greater than or equal to the severity level you've specified
you can use the --display
option. For example.
twigcs /path/to/views --severity error --display blocking
Would only display errors and not warnings.
Alternatively you can use --display all
which is the default behaviour as described above.
Continuous Integration
Twigcs can be used with your favorite CI server. The command itself will return a consistent exit code telling the CI job if it failed or succeeded. You can also have a nice xml report (checkstyle format):
twigcs /path/to/views --reporter checkstyle > /path/to/report.xml
Reporters
Twigcs currently supports to following reporters:
twigcs /path/to/views --reporter console twigcs /path/to/views --reporter checkstyle twigcs /path/to/views --reporter junit twigcs /path/to/views --reporter emacs twigcs /path/to/views --reporter json twigcs /path/to/views --reporter csv twigcs /path/to/views --reporter githubAction twigcs /path/to/views --reporter gitlab
Using older twig versions
By default twigcs is using Twig 3. This means that features like filter
tags or filtered loops using if
are not supported
anymore. You can use an older twig version using the twig-version
option:
twigcs /path/to/views --twig-version 2
Custom coding standard
At the moment the only available standard is the official one from twig.
You can create a class implementing RulesetInterface
and supply it as a --ruleset
option to the CLI script:
twigcs /path/to/views --ruleset \MyApp\TwigCsRuleset
Note: twigcs
needs to be used via composer and the ruleset class must be reachable via composer's autoloader for this feature to work.
Also note that depending on your shell, you might need to escape backslashes in the fully qualified class name:
twigcs /path/to/views --ruleset \\MyApp\\TwigCsRuleset
For more complex needs, have a look at the custom ruleset documentation.
File-based configuration
Using configuration, you can easily store per-project settings:
// ~/.twig_cs.dist.php <?php declare(strict_types=1); use FriendsOfTwig\Twigcs; return Twigcs\Config\Config::create() ->setName('my-config') ->setSeverity('warning') ->setReporter('json') ->setRuleSet(Twigcs\Ruleset\Official::class) ->setSpecificRuleSets([ // Every file matching the pattern will use a different ruleset. '*/template.html.twig' => Acme\Project\CustomRuleset::class, ]) ;
This configuration will be applied if you call twigcs from the ~/
directory. If you run twigcs from outside this directory,
you must use the --config
option:
cd ~/dirA
twigcs --config ~/dirB/.twig_cs.dist.php # Will lint templates in ~/dirA with the config of ~/dirB
By default, the files
.twig_cs.php
.twig_cs
.twig_cs.dist.php
.twig_cs.dist
are looked up in your current working directory (CWD).
You can also provide finders inside config files, they will completely replace the path in the CLI:
// ~/.twig_cs.dist.php <?php declare(strict_types=1); use FriendsOfTwig\Twigcs; $finderA = Twigcs\Finder\TemplateFinder::create()->in(__DIR__.'/dirA'); $finderB = Twigcs\Finder\TemplateFinder::create()->in(__DIR__.'/dirB'); return Twigcs\Config\Config::create() // ... ->addFinder($finderA) ->addFinder($finderB) ->setName('my-config') ;
In this case, calling twigcs
from the ~/
directory of the config will run the linter on the directories pointed by the finders.
If you explicitly supply a path to the CLI, it will be added to the list of linted directories:
twigcs ~/dirC # This will lint ~/dirA, ~/dirB and ~/dirC using the configuration file of the current directory.
Template resolution
Using file based configuration, you can provide a way for twigcs to resolve template. This enables better unused variable/macro detection. Here's the simplest example when you have only one directory of templates.
<?php declare(strict_types=1); use FriendsOfTwig\Twigcs; return Twigcs\Config\Config::create() // ... ->setTemplateResolver(new Twigcs\TemplateResolver\FileResolver(__DIR__)) ->setRuleSet(FriendsOfTwig\Twigcs\Ruleset\Official::class) ;
Here is a more complex example that uses a chain resolver and a namespaced resolver to handle vendor templates:
<?php declare(strict_types=1); use FriendsOfTwig\Twigcs; return Twigcs\Config\Config::create() ->setFinder($finder) ->setTemplateResolver(new Twigcs\TemplateResolver\ChainResolver([ new Twigcs\TemplateResolver\FileResolver(__DIR__ . '/templates'), new Twigcs\TemplateResolver\NamespacedResolver([ 'acme' => new Twigcs\TemplateResolver\FileResolver(__DIR__ . '/vendor/Acme/AcmeLib/templates') ]), ])) ;
This handles twig namespaces of the form @acme/<templatepath>
.
Upgrading
If you're upgrading from 3.x to 4.x or later, please read the upgrade guide.
Community
Join us on Symfony Devs via the twigcs channel.
Changelog
Please have a look at CHANGELOG.md
.
Contributing
The main
branch is the development branch. If you find any bug or false positive during style checking, please
open an issue or submit a pull request.
When creating or changing a class, don't forget to add you as an @author
at the top of the file.
Please have a look at CONTRIBUTING.md
.