# Gamegos PHP Code Sniffer
Gamegos PHP Code Sniffer is a PHP code standard checker/beautifier/fixer tool
based on [PHP_CodeSniffer] and
includes [custom sniffs](#custom-sniffs) used in PHP projects developed by Gamegos.
## Requirements
Gamegos PHP Code Sniffer requires PHP 5.3 or later.
## Install via Composer
```json
{
"require-dev": {
"gamegos/php-code-sniffer": "*"
}
}
```
## Binaries
Binaries are located in `bin` directory but composer installer creates links under
your vendor binary directory depending on your composer configuration.
* **phpcs :** Checks PHP files against defined coding standard rules.
* **phpcbf :** Corrects fixable coding standard violations.
* **phpcs-pre-commit :** Runs phpcs for modified files in git repository.
## Pre-Commit Hook
Save the following script as `.git/hooks/pre-commit` by replacing `COMPOSER_BIN_DIR`
as your vendor binary directory name depending on your composer configuration.
```sh
#!/bin/sh
./COMPOSER_BIN_DIR/phpcs-pre-commit
```
Make sure the hook script is executable.
```sh
chmod +x .git/hooks/pre-commit
```
## Customize
You can customize configuration by adding a file called `phpcs.xml` file into
the root directory of your project. The phpcs.xml file has exactly the same
format as a normal ruleset.xml file, so all the same options are available in
it. You need to define `Gamegos` rule to import all the `Gamegos` rules.
```xml
```
### Using a custom bootstrap file
You can add custom bootstap files to be included before beginning the run.
Some sniffs need to load classes from your project; so adding a autoload file
will allow sniffs to do this.
```xml
```
## Imported Standards
### PSR2
All PSR2 sniffs except `Squiz.WhiteSpace.ControlStructureSpacing` are imported by default.
* `PSR2.ControlStructures.ElseIfDeclaration.NotAllowed` rule type is considered as `error` instead of `warning`.
### Generic
Imported sniffs:
* All sniffs in `Generic.Formatting` category except:
* `DisallowMultipleStatements` (replaced by [`Gamegos.Formatting.DisallowMultipleStatements`](#gamegosformattingdisallowmultiplestatements))
* `NoSpaceAfterCast`
* `SpaceAfterNot`
* `Generic.Arrays.DisallowLongArraySyntax`
### Squiz
Imported sniffs:
* `Squiz.Commenting.DocCommentAlignment`
* `Squiz.Commenting.InlineComment`
* `InvalidEndChar` rule type is considered as `warning` instead of `error`.
* `Squiz.WhiteSpace.SuperfluousWhitespace`
* `Squiz.WhiteSpace.OperatorSpacing`
## Custom Sniffs
### Gamegos.Arrays.ArrayDeclaration
* Extended from `Squiz.Arrays.ArrayDeclaration`.
* Arranged array element indents by start position of the first (declaration) line.
* Number of spaces before array elements is increased from 1 to 4.
* Removed rules:
* `NoKeySpecified`
* `KeySpecified`
* `MultiLineNotAllowed`
* `NoCommaAfterLast`
* `NoComma`
### Gamegos.Commenting.DocComment
* Extended from `Generic.Commenting.DocComment`.
* Ignored `MissingShort` rule for PHPUnit test class methods [[1]](#fn1).
* Changed `MissingShort` rule type from `error` to `warning`.
* Removed rules for comments with long descriptions:
* `SpacingBetween`
* `LongNotCapital`
* `SpacingBeforeTags`
* `ParamGroup`
* `NonParamGroup`
* `SpacingAfterTagGroup`
* `TagValueIndent`
* `ParamNotFirst`
* `TagsNotGrouped`
### Gamegos.Commenting.FunctionComment
* Extended from `PEAR.Commenting.FunctionComment`.
* Added PHPUnit test class control for methods without doc comment [[1]](#fn1).
* Added `{@inheritdoc}` validation for overrided methods [[1]](#fn1).
* Removed `MissingParamComment`, `MissingReturn`, `SpacingAfterParamType` and `SpacingAfterParamName` rules.
* Ignored `MissingParamTag` rule for PHPUnit test class methods [[1]](#fn1).
### Gamegos.Commenting.VariableComment
* Extended from `Squiz.Commenting.VariableComment`.
* Added `bool` and `int` into allowed variable types.
### Gamegos.Formatting.DisallowMultipleStatements
* Extended from `Generic.Formatting.DisallowMultipleStatements`.
* Fixed adding 2 blank lines when applying `SameLine` fixer with `Squiz.Functions.MultiLineFunctionDeclaration.ContentAfterBrace` fixer together.
### Gamegos.Strings.ConcatenationSpacing
This sniff has two rules and fixes.
* `PaddingFound`: There must be only one space between the concatenation operator (.) and the strings being concatenated.
* `NotAligned`: Multiline string concatenations must be aligned.
### Gamegos.WhiteSpace.FunctionSpacing
* Extended from `Squiz.WhiteSpace.FunctionSpacing`.
* Expected no blank lines before the method which is the first defined element of a class.
* Expected no blank lines after the method which is the last defined element of a class.
* Fixed fixing spaces before method definitions.
### Gamegos.WhiteSpace.MemberVarSpacing
* Extended from `Squiz.WhiteSpace.MemberVarSpacing`.
* Expected no blank lines before the property which is the first defined element of a class.
* Fixed fixing spaces before property definitions.
## Development
### Live Testing
You can test any modifications by running [phpcs.php](scripts/phpcs.php), [phpcbf.php](scripts/phpcbf.php) and
[phpcs-pre-commit.php](scripts/phpcs-pre-commit.php) scripts under `scripts` directory.
### Building Binaries
Run the command below to re-build binaries:
```sh
php scripts/build.php
```
### PHP_CodeSniffer Dependency
Current version is built on [PHP_CodeSniffer 2.8.1](https://github.com/squizlabs/PHP_CodeSniffer/releases/tag/2.8.1)
which is locked in [composer.lock](composer.lock) file. To import new versions; edit [composer.json](composer.json) file if required and
run `composer update` command, then commit the modified [composer.lock](composer.lock) file. Updating [PHP_CodeSniffer] version may
break some of [Gamegos sniffs](#custom-sniffs), so you must carefully track any changes on [PHP_CodeSniffer] before updating.
___
[1] A class loader is required (eg. via a bootstrap file),
otherwise a warning (`Internal.Gamegos.NeedClassLoader`) will be generated.
You can override this rule in `phpcs.xml` file in your project to prevent warnings.
[↩](#fn1c1) [↩](#fn1c2) [↩](#fn1c3) [↩](#fn1c4)
___
#### License Notices
[PHP_CodeSniffer] is licensed under the [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license.
[PHP_CodeSniffer]: https://github.com/squizlabs/PHP_CodeSniffer